2011-08-24 81 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