簡體   English   中英

LINQ查詢不返回任何行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM