Как фильтровать IEnumerable на основе входного параметра объекта
Я сейчас использую Entity Framework, но это проблема, к которой он предоставил общий доступ. между всеми ORM и даже IEnumerable.
Допустим, у меня есть метод в MVC выглядит следующим образом:
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(???).ToList();
return View(data);
}
Я хочу запросить контекст на основе входного параметра, например:
var data = context.Foo.Where(x => x.Date == model.Date &&
x.Name == model.Name &&
x.ItemCode = model.ItemCode).ToList();
Но это сложнее, потому что если один из параметров выше (Date
\ Name
\ ItemCode
) является нулем. Я не хочу включать его в запрос.
Если я жесткий код, он может выглядеть примерно так:
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);
...
Должен быть более простой способ, чем этот.
Мне нужен способ для генерации выражения типаExpression<T, bool>
для использования в методе 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);
}
Есть ли встроенный способ построить это выражение? Есть ли в Nuget пакет, который это делает?
Update: В модели-сущности может быть более 30 свойств; запись 30 раз Где для каждого запроса может быть боль в шее:
.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();