2013-07-25 7 views
6

このコードに違いはありますか?チェーンlinqクエリの実行を注文

var query = DbContext.Customers 
       .Where(<condition>) 
       .Include("Address"); 

そして

var query = DbContext.Customers 
       .Include("Address") 
       .Where(<condition>); 

これは、クエリをdefferedだ、と私は知らない、それは同等ですか?または、whereの場合は、Includeの後に実行されますか?

ありがとうございました。

+4

注文は関係ありません。 – wudzik

+1

これは同等です。結果を反復処理するか、ToList()を呼び出すまで、クエリは実行されません。 – Oscar

+1

この場合、はい、LINQ To EntitiesとInclude [これは必ずしも明確なカットではありません](http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how -to-make-include-really-include.aspx) –

答えて

2

選択前のEF注文の場合は問題ありません。 LINQクエリはSQLクエリに変換されて実行され、SQLクエリオプティマイザは元のクエリの順序を気にしません。

Patrykは次のステートメントがクエリの構造を変更するが、where句はそれを行わない場合、Includeで具体的に問題が指摘できると指摘しています。

LINQ-to-Objectsの他のLINQクエリでは、クエリがSQLの処理方法に再最適化されず、単純に上から下に処理されるため、順序が大きく変わる可能性があります。 (例えば、OrderBy)に進む前に、完了と処理の結果を表示します。

+0

この場合、はい。しかし、それは常に真実ではありません。多くのクエリは、特に選択後に依存します。 –

+0

@MystereMan、選択についての良い点、私はその点を明確にするために私の答えを更新しました。要点は、すべてのLINQが同じではないことです.LINQからEFまではLINQからオブジェクトおよび他のLINQとは異なります。 LINQからEFへの変換は主にSQLに変換され、大部分の順序は重要ではありません。 –