私はMicrosoftのEntityFrameworkをORMとして使用していますが、次の問題を解決する方法を考えています。コレクションから、今日よりも大きいProduct
オブジェクトをいくつか取得したいと思います。(これは問題全体の簡略版です。)Products
Product.StartDate
私は現在使用しています:
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;
フィルタはSQLServerからクライアントに移動されるため、効率が大幅に低下します。
だから私の質問は:
- なぜこれが起こっているのですか、なぜLINQパーサーはこれらの2つの形式をそれほど異なって扱うのですか?
- フィルタを分離してサーバー上で実行することを利用するにはどうすればよいですか?