2013-03-10 13 views
6

Zaczynam używać LinqKit 's PredicateBuilder do tworzenia predykatów z warunkami OR, które nie są możliwe w wyrażeniach Linq.LinqKit PredicateBuilder zwraca wszystkie lub bez wierszy

Problem jestem stoi to jeśli zacznę PredicateBuilder.True<MyEntity>() nim zwraca wszystkie wiersze a jeśli zacznę PredicateBuilder.False<MyEntity>() to zwraca non wiersze, oprócz tego, co wyrażenia używam! spójrz na poniższy kod:

 var pre = PredicateBuilder.True<MyEntity>(); 
     pre.And(m => m.IsActive == true); 

     using (var db = new TestEntities()) 
     { 
      var list = db.MyEntity.AsExpandable().Where(pre).ToList(); 
      dataGridView1.DataSource = list; 
     } 

Powinien zwrócić wiersze, które ma IsActive == true, ale zwraca wszystkie wiersze!

Próbowałem wszystkich możliwych kombinacji PredicateBuilder.True | PredicateBuilder.False z And | Or metody, z których żaden nie działa!

Odpowiedz

13

And przesuwnych metoda nie nie modyfikuje oryginalnego orzeczenie - zwraca nowy orzeczenie reprezentującego pierwotny orzeczenie AND ed razem z określonym predykatu.

Skutecznie, swoje operacje nie zmieniają orzecznik określoną przez zmienną pre, co oznacza, że ​​skończy się albo wszystkie albo żaden z zapisów na podstawie tego, czy zainicjowana oryginalny predykat do true lub false.

Spróbuj:

var pre = PredicateBuilder.True<MyEntity>(); 
    pre = pre.And(m => m.IsActive); 

Jeśli planujesz OR orzeczników razem, pamiętaj, aby rozpocząć mecz false początkowej orzecznika.

var pre = PredicateBuilder.False<MyEntity>(); 
    pre = pre.Or(m => m.IsActive); 
+0

OMG !! To głupi błąd. Zrobiłem ten sam błąd odnośnie metody 'string.Replace' 3 lata temu !!! Dziękuję Ci bardzo. – Ashkan

+0

Dzięki za wyjaśnienie – leen3o