Jak filtrować IEnumerable na podstawie parametru wejściowego encji
Używam teraz ramy Entity - ale jest to problem „współdzielony” między wszystkimi ORM, a nawet IEnumerable.
Powiedzmy, że mam metodę w MVC wygląda następująco:
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(???).ToList();
return View(data);
}
Chcę zapytać o kontekst na podstawie parametru wejściowego, takiego jak:
var data = context.Foo.Where(x => x.Date == model.Date &&
x.Name == model.Name &&
x.ItemCode = model.ItemCode).ToList();
Ale to jest bardziej skomplikowane, ponieważ jeśli jeden z powyższych parametrów (Date
\ Name
\ ItemCode
) ma wartość NULL Nie chcę umieszczać go w kwerendzie.
Jeśli utrudnię kod, może wyglądać podobnie do tego:
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);
...
Musi być prostszy sposób.
Potrzebuję sposobu na wygenerowanie wyrażenia typuExpression<T, bool>
do użycia w metodzie 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);
}
Czy istnieje wbudowany sposób budowania tego wyrażenia? Czy istnieje pakiet w Nuget, który to robi?
Aktualizacja: W elemencie modelu może być więcej niż 30 właściwości; pisanie 30 razy Gdzie dla każdego zapytania może być ból szyi:
.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();