Как фильтровать 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();

Ответы на вопрос(3)

Ваш ответ на вопрос