2011-08-23 14 views
6

Con PredicateBuilder ¿cómo obtengo una funcionalidad similar a la consulta SQL IN o NOT IN?C# Constructor de predicados con funcionalidad "NOT IN"

Por ejemplo, tengo una lista de ID y quiero seleccionar todas las personas cuyos ID coinciden o no coinciden con los ID.

La funcionalidad de las personas partido es bastante sencillo (aunque puede haber una mejor manera de hacerlo)

var predicate = PredicateBuilder.False<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.Or(e=>e.PersonID == temp); 
} 
return persons.Where(predicate); 

Entonces, ¿cómo puedo obtener el opuesto? Quiero que todas las personas cuyos ID no estén en la lista de ID de persona.

+0

Como solución, pude obtener la lista de PersonID prefiltrados, así que puedo usar el código anterior. No es ideal, pero funcionará. –

Respuesta

3

Haz De Morgan:

NO

(P o Q) = (NO P) Y (NO Q)

A tienen su código de generar el equivalente de un no en condiciones, volver a escribir como

var predicate = PredicateBuilder.True<Person>() 

y

predicate = predicate.And(e=>e.PersonID != temp); 
+0

Eso es lo que probé la primera vez, sin embargo, estoy obteniendo un conjunto de resultados vacío de SQL. Cuando inspecciono el SQL de Profiler obtengo algo al efecto de SELECCIONE CAST (NULL como varchar (1)) como [C1], . . . FROM (SELECCIONAR 1 como X) AS [SingleRowTable1] DONDE 1 = 0 –

0

¿Es esto lo que quieres?

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e => e.PersonID != temp); 
} 
return persons.Where(predicate); 
0

Sin mirar a la API ....

var predicate = PredicateBuilder.True<Person>() 
foreach (int i in personIDs) 
{ 
    int temp = i; 
    predicate = predicate.And(e=>e.PersonID != temp); 
} 
return persons.Where(predicate); 
3

¿Utiliza Marco de la entidad?

A continuación, puede construir la consulta sin PredicateBuilder:

var personIds = new List<int>() { 8,9,10 }; 
var query = persons.Where(it => !personIds.Contains(it.PersonId)); 

partir de esta declaración de LINQ un SQL NO EN se crea consulta.