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 回答