2012-06-25 26 views
8

Quiero escribir una consulta RavenDB que filtre por un valor si está disponible, pero si ese valor no está disponible, quiero que devuelva todos los objetos. Por ejemplo, en LINQ a objetos, puedo hacer algo como esto:RavenDB - Opcional en la cláusula

var matches = people.Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList(); 

Pero la siguiente no funcionará:

var matches = RavenSession.Query<Person>().Where(x => x.LastName == userEntry || userEntry == string.Empty).ToList(); 

Debido userEntry no es un valor indexado, esto arroja una excepción.

¿Cómo puedo lograr esto?

+0

peor de los casos, acaba de hacer una sentencia if para comprobar 'userEntry == string.Empty' y consulta ¡en consecuencia! ¡Bonificación, es más fácil de entender! – banging

+0

Creo que veo lo que quieres decir, pero simplifiqué la pregunta para mayor claridad. Mi escenario real es más complicado, donde tengo ~ 10 campos que son todos opcionales para el filtrado, y cualquiera que el usuario rellene, quiero incluirlos en la consulta. Pero si el usuario los deja en blanco, deberían dejarse de lado. Por lo tanto, sería poco práctico escribir si las declaraciones con diferentes consultas para cada posible combinación de filtros. –

Respuesta

9

Basado en su comentario sobre múltiples predicados opcionales, debe ser capaz de hacer algo como esto:

var where = new List<Expression<Func<Person, bool>>>(); 

if (!string.IsNullOrWhitespace(lastName)) 
    where.Add(p => p.LastName == lastName); 

if (!string.IsNullOrWhitespace(firstName)) 
    where.Add(p => p.FirstName == firstName); 

// etc... 

var query = session.Query<Person>(); 

foreach (var clause in where) 
    query = query.Where(clause); 

var results = query.ToList(); 
+1

Perfecto, eso es justo lo que estaba buscando. ¡Gracias! –