2011-08-24 58 views
4

下面的代码:如何使用动态OR语句构建Linq查询?

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(); 

会让我创建LINQ查询与表达的动态列表。

但假设我想要做同样的事情,只能使用动态列表表达式?

回答

6

你并不需要循环都:

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”开头的是合适的,等

+0

虽然这确实答案这种特定情况下,有没有更通用的方法 – sternr

+0

@sternr:请问编辑...... –

+0

那是我最初的想,但它给了我一个stackoverflow异常,就好像谓词调用它自己而不是以前的Func – sternr