2010-10-19 17 views
9

Así que tengo un modelo creado en Entity Framework 4 utilizando las primeras funciones del código CTP4. Todo esto está funcionando bien juntos.Entity Framework Code First y Criterios de búsqueda

Estoy intentando agregar una función de búsqueda avanzada a mi aplicación. Esta función de "búsqueda avanzada" simplemente permite a los usuarios ingresar múltiples criterios para buscar por. Por ejemplo: Buscar

Avanzada Producto

  • Nombre
  • Fecha de Inicio
  • fecha de finalización

Esto permitiría al usuario buscar por el nombre del producto y también limitar el resultados por las fechas en que fueron creados.

El problema es que no sé cuántos de estos campos se utilizarán en una sola búsqueda. ¿Cómo puedo entonces construir mi consulta de Entity Framework?

Tengo an example que describe cómo crear una consulta dinámica para Entity Framework, sin embargo, esto no parece funcionar para las clases de POCO que creé para la persistencia de Code First.

¿Cuál es la mejor manera de construir una consulta cuando se desconoce la cantidad de restricciones?

Respuesta

20

Así que después de algunas horas de trabajo en este problema (y un poco de ayuda de nuestro amigo Google) he encontrado una solución viable para mi problema. He creado la siguiente LINQ extensión de la expresión:

using System; 
using System.Linq; 
using System.Linq.Expressions; 

namespace MyCompany.MyApplication 
{ 
    public static class LinqExtensions 
    { 
     public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) 
     { 
      if (condition) 
       return source.Where(predicate); 
      else 
       return source; 
     } 
    } 
} 

Esta extensión permite una consulta LINQ que se creará de esta manera:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name) 
           .WhereIf(startDate != null, p => p.CreatedDate >= startDate) 
           .WhereIf(endDate != null, p => p.CreatedDate <= endDate); 

Esto permite que cada declaración WhereIf afecte sólo los resultados si cumple con la proporcionada condición. La solución parece funcionar, pero siempre estoy abierto a nuevas ideas y/o críticas constructivas.

+0

Brilliant! ¡Gracias! –

+0

+1 Código de código muy útil. –

+0

podemos usar in-buil where(). Where() pero ¿por qué debería alguien usar su extensión? ¿Qué es tan especial allí? –

0

John,

¡Su solución es absolutamente increíble! Pero, solo para compartir, he estado usando este método arriba hasta que vea tu ideia.

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword)); 

Por lo tanto, parece que no es la mejor solución para esto, pero seguro que es una forma de evitarlo.

Cuestiones relacionadas