2011-08-17 14 views
7

Jaki jest najlepszy sposób wykonania zapytania warunkowego przy użyciu linq do obiektów (nie linq do sql).Linq do obiektów Konstruktor predykatów

Obecnie używam konstruktora predykatów znalezionego tutaj http://www.albahari.com/nutshell/predicatebuilder.aspx i przekazywanie skompilowanego predykatu do IEnumerable.Where i wydaje się, że działa ładnie.

Przykład kodu co chcę rozwiązać:

np mam ten

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

Odpowiedz

14

Wystarczy zmienić PredicateBuilder używać delegatów zamiast wyrażenia drzew i użyć lambdy zbudować wyniki:

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

To działa Dziękuję Jon, czy są jakieś problemy z wydajnością, które mogą być spowodowane przez budowanie zapytań takich jak to, czy robi się to manualnie z długimi instrukcjami if – kwiri

Powiązane problemy