1

私は 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;
4

3 に答える 3

3

あなたの投稿のロジックは不安定です。これが、あなたが達成しようとしていると思うことの私の試みです。

DataTable table = MyTable.AsEnumerable()
     .Where(r => characteristics.All(c => !c.IsIncluded ||
                                          r.Field<string>(c.Name) == c.Value))
     .CopyToDataTable();

投稿で実際にロジックを使用したい場合は、 に変更||します^が、ほとんど意味がないようです。

于 2011-01-12T19:00:46.070 に答える
1

行をテーブルに挿入するだけの場合は、次の方法で CopyToDataTable メソッドを呼び出してみてください。

q.CopyToDataTable(table, LoadOption.PreserveChanges);

このようにして、テーブル変数を再割り当てするのではなく、挿入される新しい行で更新することができます。

編集:これは私が話していたことの例です:

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Value", typeof(string));
于 2011-01-12T18:58:28.260 に答える
1

各特性の変数を上書きするtableため、最終的には最後のラウンドの結果のみが保持され、それは明らかに空です。

あなたができることは次のようなものです:

// untested
var t = q.CopyToDataTable();
table.Merge(t);

そして、クエリは MyTable をソースとして使用する必要があると思います:

var q = (from r in MyTable.AsEnumerable() ...

しかし、それは完全には明らかではありません。

于 2011-01-12T18:52:04.747 に答える