Estoy utilizando ahora Entity framework, pero es un problema "compartido" entre todos los ORM e incluso IEnumerable.Cómo filtrar IEnumerable basado en un parámetro de entrada de entidad
Digamos que tengo un método en el MVC 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 I Código difícil que puede ser similar a ésta:
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);
...
Tiene que haber una manera más simple que esto.
Necesito una forma de generar una expresión del tipo Expression<T, bool>
para usar 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 de construir esa expresión? ¿Hay algún paquete en nuget que lo haga?
Actualización: Podría haber más de 30 properites en el modelo de entidad; escribir 30 veces el lugar 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();
Un ejemplo que muestra cómo se usa este método será muy útil. – devinbost