2016-06-14 8 views
8

複数のWhere(...)メソッドを順番に使用すると、EntityFrameworkは結果のクエリでそれを組み合わせるのに十分スマートです。のは、私が持っているとしましょう:EntityFramework Multiple Where

context.Items 
    .Where(item => item.Number > 0) 
    .Where(item => item.Number < 5) 
    .ToList(); 

結果のSQLクエリは、私が書く場合と同じになります。

context.Items 
    .Where(item => item.Number > 0 && item.Number < 5) 
    .ToList(); 

は、複数のWhere句のための任意の舞台裏の最適化はありますか?

+0

を使用する場合、彼らはすべての主要なプロバイダーで同じSQLに変換する必要があり、両方のクエリでSQLを生成見ることができます。あなたはいつでも両方を試すことができ、それぞれが作り出すSQLを見ることができます。 –

+1

はい複数の場合は、&&(条件で約1分で自分自身を確認できました)の条件と同じです。 – Evk

+0

@Evk私は、JITや構文砂糖の最適化を、文書やILに掘り下げずにすばやく検証することはできませんでした。私の最後の質問を見てください。ありがとう。 – Andrei

答えて

5

はい、あります。これを行うのはEntity Frameworkではありません。実際には、データベースのクエリを作成するSQLプロバイダファクトリの仕事です。使用するデータベースに応じて、このコードはさまざまなソースから取得されます。

MSSQLの場合、コードはMicrosoftのもので、ライブラリSystem.Data.SqlClientにあります。 web.configの接続要素を見ると、属性 "providerName"に気づくはずです。

このライブラリまたはそれに似たライブラリの中に、再帰的訪問者パターンを使用して、定義されたExpression Treeオブジェクトグラフをナビゲートして、可能な限り最も効率的なクエリを生成することがよくあります。

複数のwhere節を使用すると、検出と最適化が非常に簡単です。これらのライブラリに問題がある場所は、深く入れ子になった投影になる傾向があります。

あなたは

context.Items 
.Where(item => item.Number > 0) 
.Where(item => item.Number < 5) 
.ToString(); 
+0

あなたの答えをありがとう! – Andrei