私はMicrosoftのEntity FrameworkをORMとして使用していますが、次の問題を解決する方法が不思議です。 今日Product.StartDate
が今日よりも大きいProducts
コレクションから多数のProduct
オブジェクトを取得します。 (これは、問題全体の簡易版です。)EntityFrameworkのLINQパーサーが外部定義された述語を異なる方法で処理するのはなぜですか?
私は現在使用します。
var query = dbContext.Products.Where(p => p.StartDate > DateTime.Now);
これを実行すると、クエリに例えばToList()
を使用した後、それが動作して作成されたSQLが効果的である:
SELECT * FROM Product WHERE StartDate > (GetDate());
しかし、私はより良い保守のための関数に述語を移動したいので、私はこの試みた:
private Func<Product, bool> GetFilter()
{
Func<Product, bool> filter = p => p.StartDate > DateTime.Now;
return filter;
}
var query = dbContext.Products.Where(GetFilter());
を
これもそれは同じProduct
セットを返しますが、SQLを作成し、この時間が類似している限り、ビューのコードポイントから動作します:
SELECT * FROM Product;
フィルタは、それを行っているクライアントへのSQL Serverから移動されますはるかに効率が悪い。
だから私の質問は以下のとおりです。
- ですが、なぜでしょう、なぜLINQパーサはとても異なっこれら二つのフォーマットを処理するのでしょうか?
- フィルタを別にしても、サーバー上で実行させることを利用するにはどうすればよいですか?
+1ちょうど私にそれを打つ。 –
@Dommer haha!私は通常、非常に良い "クイックドロー"ではありません! –
ありがとうございました。 –