2016-01-27 4 views
5

は、私はフィルタリングされたリストを返すMyList.OrderBy(x => x.prop1)LINQは "クエリ"を最適化する方法を知っていますか?

var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2); 

ような何かを行うと仮定し、それがさらにThenBy(x => x.prop2)によってそのリストをフィルタリングしていますか?つまり、

と等価ですか?

明らかにそれはコンパレータでソートアルゴリズムを実行することによって、これを最適化することが可能だからです。

var Ordered = MyList.Sort((x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : (x.prop2 < y.prop2)); 

それは、最適化のいくつかの並べ替えをするのかと中間リストがプロセスに返されていない、そしてそれはどのように知っていない場合どうやってするか?メソッドチェーンを最適化するクラスをどうやって書くのですか?意味がありません。

+0

LINQの味は?オブジェクトへのLINQ、エンティティへのLINQなど –

+0

そしてLinqがエンティティにLinqプロバイダの場合は?沢山あります。 Linq to Entitiesプロバイダがクエリをよりよく最適化するようにEF7に変更が加えられていることに注意してください。 –

+0

データベースに接続している場合は、SQLプロファイラを使用して、それぞれのケースで生成されたデータベースクエリを比較し、違いがあればそれが何であるかを確認します。 – ChrisF

答えて

7

番号LINQメソッドフィルタされたリストを返すMyList.OrderBy(x => x.prop1)ない(少なくとも一般的に)戻りそれらのクエリを実行しない結果、を問い合わせます。

OrderByは、アイテムを要求すると、特定の順序でコレクション内の最初のアイテムを返すオブジェクトを返します。しかし、実際に結果を求めるまでは、何もしていません。

また、OrderByが返すものだけを見て、何が起こっているかについてまともな考えを得ることができます。 IOrderedEnumerable<T>を返します。そのインタフェースは、CreateOrderedEnumerableのメソッドを持ちます。

次に、キーに従ってIOrderedEnumerableの要素を順序付けします。

この方法は、ThenByが次の注文があることを示すために使用します。

これはを設定あなたは結果内の単一アイテムを生成する必要がある前に、あなたはOrderByからあなたが使用したいする比較器、およびすべてのThenBy通話のすべてを構築していることを意味します。

の詳細については、の詳細については、Jon Skeet's blog series on the subjectを参照してください。

+0

Jon Skeetが質問に答えなかった場合でも、質問に答えます。 –

関連する問題