2011-08-17 100 views
7

什麼是最好的方式做一個條件查詢使用LINQ到對象(不是LINQ到SQL)。Linq to objects謂詞生成器

目前我正在使用此處發現的謂詞構建器http://www.albahari.com/nutshell/predicatebuilder.aspx 並將編譯的謂詞傳遞給IEnumerable.Where,它似乎很好地工作。什麼,我想解決

示例代碼:

例如,我有這個

string keyword1 = "Test1"; 
string keyword2 = "Test3"; 

     IEnumerable<TestObject> tests = new List<TestObject>() 
            { 
             new TestObject() {Name1 = "Test1", Name2 = "Test1"}, 
             new TestObject() {Name1 = "Test2", Name2 = "Test2"}, 
             new TestObject() {Name1 = "Test3", Name2 = "Test3"}, 

            }; 

     if (!String.IsNullOrEmpty(keyword1) && String.IsNullOrEmpty(keyword2)) 
      tests = tests.Where(e => e.Name1.Contains(keyword1)); 
     else if (!String.IsNullOrEmpty(keyword2) && !String.IsNullOrEmpty(keyword1)) 
      tests = tests.Where(e => e.Name2.Contains(keyword2) || e.Name1.Contains(keyword1)); 

     return tests.ToList(); 

回答

14

只要改變PredicateBuilder使用委託,而不是表達式樹和使​​用lambda表達式來構建的結果:

public static class DelegatePredicateBuilder 
{ 
    public static Func<T, bool> True<T>() { return f => true; } 
    public static Func<T, bool> False<T>() { return f => false; } 

    public static Func<T, bool> Or<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) || expr2(t); 
    } 

    public static Func<T, bool> And<T>(this Func<T, bool> expr1, 
            Func<T, bool> expr2) 
    { 
     return t => expr1(t) && expr2(t); 
    } 
} 
+1

工作原理感謝喬恩,是否有任何性能問題,可以通過構建像這樣的查詢造成的,而對於long if – kwiri