我现在正在使用实体框架-但这是所有 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);
...
一定有比这更简单的方法。我需要一种方法来生成要在 Where 方法中使用
的类型的表达式。Expression<T, bool>
[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中是否有一个包可以做到这一点?
更新:模型实体中可能有 30 多个属性;为每个查询写 30 次 Where 可能会让人头疼:
.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();