2012-04-05 25 views
7

Tengo una consulta linq. Tengo un conjunto de parámetros de un formulario que recopilo donde necesito filtrar en función de los campos que el usuario está buscando.Parámetros opcionales de Linq

IQueyable<Users> user = from user in edmxObject.Users 
where user.FirstName.Contains(model.FirstName ?? user.FirstName) 
&& user.UserName.Contains(model.UserName ?? user.UserName) 

Tengo algunos filtros de campo no de cadena que necesito filtrar, incluidos long y boolean. Podrían ser nulos si el usuario no selecciona nada. ¿Cómo los incluyo en la consulta?

+0

¿Esta lista es desconocida? ¿Como un tipo de generador de consultas? – Jodrell

+0

Entonces, la clase 'modelo' tiene algunas propiedades arbitrarias que pueden coincidir con los atributos de la entidad' Usuario' o, ¿es la relación más fuerte? – Jodrell

Respuesta

16

Este es uno de los mejores ejemplos de por qué LINQ es tan poderoso - ejecución diferida. Se puede construir hasta la consulta en diferentes fases, y sólo cuando la consulta es finalmente ejecutado o se resuelve, se generará la instrucción SQL:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

Depende del DataContext, pero es posible que necesite definir 'query' como' IQueryable <> 'en lugar de usar' var'. Algunos proveedores lo tienen como una clase que implementa 'IQueryable <>'. También puede virar en un 'AsQueryable()' después de 'Users'. – Servy

+1

también podría usar 'query = query.Where (u => u.FirstName.Contains (model.FirstName));' dentro de su instrucción if. Depende de su sintaxis preferida. –

+0

@Servy lo he actualizado para eso. Buena captura, gracias! – Yuck

5

Si la consulta no incluye un campo en particular, no es necesario incluirlo como parte de la cláusula where en absoluto:

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

puede condicionalmente nido de predicados de esta manera para asegurarse de que tiene sólo las condiciones que realmente necesita.

+0

gracias que ayudó. – desiguy

Cuestiones relacionadas