2011-09-15 16 views
6

Tengo alguna tabla y la siguiente condición de consulta: si el parámetro A es nulo, tome todo, si no, utilícelo en la consulta. Sé cómo hacer eso en 2 pasos:Linq: cómo excluir la condición si el parámetro es nulo

List<O> list = null; 
if (A = null) 
{ 
    list = context.Obj.Select(o => o).ToList(); 
} 
else 
{ 
    list = context.Obj.Where(o.A == A).ToList(); 
} 

¿Es posible tener lo mismo que una consulta? Gracias

+2

Creo que no es necesario el 'Select()' allí. – svick

+0

¡Espero que quieras decir 'A == null'! (C# debe evitar que se compile, pero siempre es mejor asegurarse de que el código publicado sea un formulario compilable adecuado. Es importante ser crítico con el código publicado porque * would * have compiled [pero no funcionó como se esperaba] en algunos idiomas). –

Respuesta

16

¿Qué tal:

list = context.Obj.Where(o => A == null || o.A == A) 
        .ToList(); 

EDIT: Puede hacerlo en una consulta, pero aún utilizando una condición:

IEnumerable<O> query = context.Obj; 
if (A != null) 
{ 
    query = query.Where(o => o.A == A); 
} 
var list = query.ToList(); 
+0

De esta manera, la condición 'A == null' se evaluaría para cada elemento de la colección, aunque más legible, no creo que sea totalmente correcto. –

+1

@ AS-CII, no necesariamente. Ese sería el caso para LINQ a los objetos. Pero esta consulta parece LINQ to SQL o algo similar. – svick

+0

Déjame probar este. Gracias. – mimic

3

que probablemente escribir la consulta como la siguiente:

IQueryable<O> query = context.Obj; 
if (A != null) 
    query = query.Where(o => o.A == A); 
var list = query.ToList() 

No es una expresión, pero creo que es bastante legible.

Además, este código asume que context.Obj es IQueryable<O> (por ejemplo, está utilizando LINQ to SQL). Si ese no es el caso, simplemente use IEnumerable<O>.

0

tratar

context.Obj.Where(a => A != null && a.A == A).ToList() 

todos deben ser buenos. Si A es nulo, se ignorará 'a.A == A'.

2

he optado por

var list = context.Obj.Where(o => A.HasValue ? o.a == A : true); 
Cuestiones relacionadas