私は現在EntityFrameworkを使用していますが、すべての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
ただし、上記のパラメータの1つ( \ Name
\ ItemCode
)がnullの場合、クエリ内に含めたくないため、それよりも複雑です。
ハードコーディングすると、次のようになります。
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を超えるプロパティが存在する可能性があります。各クエリのWhereを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();