Cómo filtrar IEnumerable basado en un parámetro de entrada de entidad
Estoy usando Entity framework, pero es un problema "compartido" entre todos los ORM e incluso IEnumerable.
Digamos que tengo un método en MVC que se ve así:
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(???).ToList();
return View(data);
}
Quiero consultar el contexto basado en el parámetro de entrada como:
var data = context.Foo.Where(x => x.Date == model.Date &&
x.Name == model.Name &&
x.ItemCode = model.ItemCode).ToList();
Pero es más complicado que eso, porque si uno de los parámetros anteriores (Date
\ Name
\ ItemCode
) es nulo No quiero incluirlo dentro de la consulta.
Si codifico duro puede ser similar a esto:
var query = context.Foo;
if (model.Date != null)
query =query.Where(x => x.Date == model.Date);
if (model.ItemCode != null)
query =query.Where(x => x.ItemCode == model.ItemCode);
...
Debe haber una manera más simple que esta.
Necesito una forma de generar una expresión del tipo.Expression<T, bool>
Para ser utilizado en el método Where.
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(THE_EXPRESSION).ToList();
return View(data);
}
¿Hay una forma incorporada para construir esa expresión? ¿Hay un paquete en nuget que lo hace?
Actualizar: Podría haber más de 30 propiedades en la entidad modelo; Escribir 30 veces el Dónde para cada consulta puede ser un dolor en el cuello:
.Where(model.Date != null, x => x.Date == model.Date)
.Where(model.Name != null, x => x.Name == model.Name)
.Where(model.ItemCode != null, x => x.ItemCode == model.ItemCode)
...
...
...
.ToList();