如何使用动态OR语句构建Linq查询?

时间:2011-08-24 18:18:33

标签: c# linq entity-framework

以下代码:

var dynamicQuery = from a in _context.Users select a;
string[] args = new string[] { "aa", "bb", "cc" };
foreach (string word in args)
    dynamicQuery = dynamicQuery.Where(x => x.Name.Contains(word));
return dynamicQuery.ToList();

允许我使用 AND 表达式的动态列表创建Linq查询。

但是假设我想做同样的事情,只有动态的 OR 表达式列表?

1 个答案:

答案 0 :(得分:10)

您根本不需要循环:

return _context.Users.Where(x => args.Any(word => x.Name.Contains(word)));

编辑:更一般地说,您可以使用:

Func<User, bool> predicate = user => false;
foreach (var item in items)
{
    var predicateCopy = predicate;
    predicate = user => predicateCopy(user) || someOtherCondition;
}
return query.Where(predicate);

这将导致相当深的堆栈(一个委托调用另一个委托另一个等)。如果特定情况允许您使用Any,那通常是更好的方法。

我希望Any能够在大多数情况下工作,在这种情况下,你有一系列可能与之匹配的项目......非Any方法适用于“在某些情况下,任何人超过18是好的...在某些情况下,任何姓氏以“G”开头的人都是合适的等等。