私は LINQ を初めて使用するので、以下のロジックに誤りがあると確信しています。
オブジェクトのリストがあります:
class Characteristic
{
public string Name { get; set; }
public string Value { get; set; }
public bool IsIncluded { get; set; }
}
リスト内の各オブジェクトを使用して、LINQ で a で始まるクエリを作成DataTable
し、オブジェクトの値に基づいてフィルター処理しDataTable
、結果として a を生成したいと考えています。
これまでの私のコード:
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();
}
}
アップデート
私は慌てて急いでいて、間違いを犯しました。myDataTable
は空ではありませんでした。にバインドするのを忘れただけ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;