2013-05-25 26 views
11

Sto cercando di capire se ci sono eventuali calo di prestazioni nell'utilizzo di una clausola OrderBy prima clausola Where in questo modo:OrderBy clausola prima della clausola Where - performance?

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

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

O sarà il compilatore riorganizzare le istruzioni in modo che la clausola Where viene eseguito prima clausola OrderBy?

+0

Compilare il codice e archiviare ILDASM il codice finale generato in entrambi i casi – 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

risposta

10

Questo dipende molto dal provider LINQ (la classe che implementa IQueryable<T>).

In Entity Framework e LINQ to SQL (e altri provider LINQ correlati al database), la query viene convertita in istruzioni SQL e quindi verrà eseguita sul motore del database. Per esempio, la seguente interrogazione:

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

quando iterata sopra, verrà convertito in:

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

, non importa dove si mette la clausola di OrderBy.

Quindi, in questo caso, non si verificano picchi di rendimento. Ma quando usi LINQ to Objects (come nel tuo esempio), le due varianti hanno un sacco di differenze nelle prestazioni. This answer form Jon Skeet copre abbastanza bene questo caso.

+0

Cosa succede se si trattava di un framework di entità? –

+0

ma prima o poi verranno eseguiti. Cosa succederà in quel momento? – Guanxi