2013-05-25 17 views
11

私はどんなパフォーマンスヒットはそうのようなWhere句の前のOrderBy句を使用してあるかどうかを理解しようとしている:WhereBy節の前にWhere節 - パフォーマンス?

List<string> names = new List<string> { //... }; 

var ns = names.OrderBy(n => n).Where(n => n.Length == 5); 

または句がのOrderBy句の前に実行されますどこので、コンパイラが命令を再配置するのだろうか?

+0

コードをコンパイルし、両方のケースで生成された最終コードをILDASMでチェックしてください。 – Guanxi

+0

http://blogs.msdn.com/b/csharpfaq/archive/2009/01/26/does-the-linq-to-objects -provider-have-built-in-performance-optimization.aspx – dotNET

答えて

10

これは実際にLINQプロバイダ(IQueryable<T>を実装するクラス)に依存します。

Entity FrameworkとLINQ to SQL(および他のデータベース関連のLINQプロバイダ)では、クエリがSQL文に変換され、データベースエンジン上で実行されます。たとえば、このクエリは:あなたがOrderBy句を入れ

SELECT * FROM names WHERE LEN(name) == 5 ORDER BY name 

どんなに:繰り返し処理時に

var ns = names.OrderBy(n => n).Where(n => n.Length == 5); 

、に変換されます。

この場合、パフォーマンスが低下しません。しかし、LINQ to Objectsを使用している場合(例のように)、2つのバリエーションはパフォーマンスに大きな違いがあります。 This answer form Jon Skeetはこのケースをかなりうまくカバーしています。

+0

これがエンティティフレームワークの場合はどうなりますか? –

+0

ですが、遅かれ早かれ実行されます。その時に何が起こるでしょうか? – Guanxi