[英]LINQ query returning no rows
我是LINQ的新手,所以我確定下面的邏輯中有錯誤。
我有一個對象列表:
class Characteristic
{
public string Name { get; set; }
public string Value { get; set; }
public bool IsIncluded { get; set; }
}
使用列表中的每個對象,我想在LINQ中構建一個以DataTable
開頭的查詢,並根據對象值對其進行過濾,並生成一個DataTable
作為結果。
到目前為止,我的代碼:
DataTable table = MyTable;
// Also tried: DataTable table = MyTable.Clone();
foreach (Characteristic c in characteristics)
{
if (c.IsIncluded)
{
var q = (from r in table.AsEnumerable()
where r.Field<string>(c.Name) == c.Value
select r);
table = rows.CopyToDataTable();
}
else
{
var q = (from r in table.AsEnumerable()
where r.Field<string>(c.Name) != c.Value
select r);
table = q.CopyToDataTable();
}
}
更新
我着急了,我犯了一個錯誤。 我的DataTable
不為空,我只是忘記了將其綁定到DataGrid
。 而且, 亨克·霍爾特曼 ( Henk Holterman)指出,我每次迭代都覆蓋我的結果集,這是一個邏輯錯誤。
到目前為止,Henk的代碼似乎效果最好,但是我需要做更多的測試。
Spinon的回答也使我頭腦清晰,但他的代碼給了我一個錯誤。
我需要嘗試更好地理解Timwi的代碼,但是按照目前的形式,它對我不起作用。
新密碼
DataTable table = new DataTable();
foreach (Characteristic c in characteristics)
{
EnumerableRowCollection<DataRow> rows = null;
if (c.IsIncluded)
{
rows = (from r in MyTable.AsEnumerable()
where r.Field<string>(c.Name) == c.Value
select r);
}
else
{
rows = (from r in MyTable.AsEnumerable()
where r.Field<string>(c.Name) != c.Value
select r);
}
table.Merge(rows.CopyToDataTable());
}
dataGrid.DataContext = table;
您發布的邏輯很奇怪; 這是我對您認為要實現的目標的嘗試。
DataTable table = MyTable.AsEnumerable()
.Where(r => characteristics.All(c => !c.IsIncluded ||
r.Field<string>(c.Name) == c.Value))
.CopyToDataTable();
如果您實際上想在發布中使用邏輯,請更改||
到^
,但這似乎毫無意義。
您覆蓋了每個特征的table
變量,因此最后它僅保留上一輪的結果,而且顯然是空的。
您可以做的是:
// untested
var t = q.CopyToDataTable();
table.Merge(t);
而且我懷疑您的查詢應使用MyTable作為來源:
var q = (from r in MyTable.AsEnumerable() ...
但這還不是很清楚。
如果您只是嘗試將行插入表中,請嘗試通過以下方式調用CopyToDataTable方法:
q.CopyToDataTable(table, LoadOption.PreserveChanges);
這樣,您無需重新分配表變量,而只需使用要插入的新行對其進行更新即可。
編輯:這是我正在談論的一個示例:
DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Value", typeof(string));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.