Cómo filtrar IEnumerable basado en un parámetro de entrada de entidad

Estoy usando Entity framework, pero es un problema "compartido" entre todos los ORM e incluso IEnumerable.

Digamos que tengo un método en MVC que 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 codifico duro puede ser similar a esto:

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

Debe haber una manera más simple que esta.
Necesito una forma de generar una expresión del tipo.Expression<T, bool> Para ser utilizado 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 para construir esa expresión? ¿Hay un paquete en nuget que lo hace?

Actualizar: Podría haber más de 30 propiedades en la entidad modelo; Escribir 30 veces el Dónde 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();

Respuestas a la pregunta(3)

Su respuesta a la pregunta