2013-03-10 9 views
6

Inizio a utilizzare LinqKit's PredicateBuilder per creare predicati con condizioni OR che non sono possibili con le espressioni Linq.LinqKit PredicateBuilder restituisce tutte o meno le righe

Il problema che sto affrontando è se comincio con PredicateBuilder.True<MyEntity>() esso restituisce tutte le righe e se comincio con PredicateBuilder.False<MyEntity>() esso restituisce non filari, oltre a quanto espressioni che uso! guarda il codice qui sotto:

 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; 
     } 

Dovrebbe restituire le righe che ha IsActive == true, ma restituisce tutte le righe!

Ho provato tutte le possibili combinazioni di PredicateBuilder.True | PredicateBuilder.False con And | Metodi Or, non di loro funziona!

risposta

13

L'estensione metodo And non modificare il predicato originale - restituisce un predicato nuova che rappresenta l'originale predicato AND ed insieme con il predicato specificato.

In effetti, le operazioni non stanno cambiando il predicato a cui si riferisce la variabile pre, che significa si finisce con tutti o nessuno dei record in base se si inizializzato il predicato originale per true o false.

Prova:

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

Se avete intenzione di OR predicati insieme, ricordarsi di iniziare con un predicato iniziale false.

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

OMG !! È un errore stupido. Ho fatto lo stesso errore sul metodo 'string.Replace' 3 anni fa !!! Grazie mille. – Ashkan

+0

Grazie per il chiarimento – leen3o

Problemi correlati