1

可変量の列に対して動的な where 句を作成したいと思います。これはできますか?

このトピックに関連するすべての投稿を見たと思いますが、まだ答えが見つかりません。

var results = from table1 in dt1.AsEnumerable()
              join table2 in dt2.AsEnumerable() on table1.Field<int>("ID") equals table2.Field<int>("ID")
              where table1["ColumnA"].ToString() != table2["ColumnA"].ToString() ||
                    table1["ColumnB"].ToString() != table2["ColumnB"].ToString() || 
                    table1["ColumnC"].ToString() != table2["ColumnC"].ToString()
              select table1;
4

2 に答える 2

0

動的 where 句の場合は、どちらかSystem.Linq.Dynamic( ScottGu のブログ記事nuget ) を使用できます。

var results = (from fruit in fruits 
    join car in cars on fruit.Id equals car.Id
    select new { fruit, car })
    .AsQueryable()
    .Where("fruit.ColA != car.ColA")
    .Where("fruit.ColB == car.ColB");

または、@joe-albahari によって書かれた拡張機能をPredicateBuilder使用して、これを動的に構築します。例えば:

var predicate = 
    PredicateBuilder
        .True<Tuple<Product, Product>>()
        .And(t => t.Item1.ColA != t.Item2.ColA)
        .And(t => t.Item1.ColB == t.Item2.ColB)
        .Compile();    

(from fruit in fruits 
    join car in cars on fruit.Id equals car.Id
    select Tuple.Create(fruit, car))
    .Where(predicate)
    .Dump();

ps: 完全なコードはgisthubで入手できます

于 2012-12-11T15:46:48.953 に答える
0

where句を論理的に追加できます。これはそれを行う拡張メソッドです(私のものではありません。ずっと前にStackOverflowのどこかで見ました。見つけたら参照します)

Func<T, bool> And(this Func<T, bool> a, Func<T, bool> b) 
{ 
    return (T x) => a(x) && b(x); 
}

これにより、列を反復処理して where 句に追加できます。

Func<string, bool> whereClause = x => true;
foreach(string columnName in dt.Columns.Select(x => x.ColumnName)
{
    string first = dt.Columns[columnName].ToString();
    string second = dt2.Columns[columnName].ToString();

    whereClause = whereClause.And(x => first.Equals(second));
}

var result = (from foo in bar select fooBar).Where(whereClause);
于 2012-12-11T13:53:27.643 に答える