2013-05-25 18 views
11

Próbuję zrozumieć, czy są jakieś uderzenie wydajność w stosowaniu klauzuli OrderBy przed Where tak:Klauzula OrderBy przed klauzulą ​​Where - performance?

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

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

Albo kompilator przestawiać instrukcji więc Where zostanie wykonany przed klauzula OrderBy?

+0

Skompiluj kod i sprawdź w ILDASM końcowy kod wygenerowany w obu przypadkach: – 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

Odpowiedz

10

To naprawdę zależy od dostawcy LINQ (klasy, która implementuje IQueryable<T>).

Na Entity Framework i LINQ do SQL (i innych dostawców LINQ powiązanych z bazą danych) zapytanie jest konwertowane na instrukcje SQL, a następnie uruchamiane w silniku bazy danych. Na przykład, to zapytanie:

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

kiedy powtórzyć skończy, zostaną zamienione na:

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

Nie ważne gdzie można umieścić klauzulę OrderBy.

W tym przypadku nie ma żadnego wyniku skuteczności. Ale kiedy używasz LINQ do Objects (jak w twoim przykładzie), dwie odmiany mają dużą różnicę w wydajności. This answer form Jon Skeet dość dobrze pokrywa się z tym przypadkiem.

+0

Co się stanie, jeśli jest to framework encji? –

+0

, ale prędzej czy później zostaną wykonane. Co się stanie w tym czasie? – Guanxi

Powiązane problemy