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();

questionAnswers(3)

yourAnswerToTheQuestion