2010-09-23 14 views
39

Esiste una differenza di prestazioni tra le seguenti due istruzioni?Sintassi query LINQ .NET vs catena metodo

from item in collection 
where item.id == 3 
select item 

e

collection.Where(item => item.id ==3) 

In generale, v'è alcuna differenza di prestazioni tra la sintassi LINQ e la catena metodo?

+1

Più correttamente è "espressione di comprensione" e "interfaccia fluente" (nel primo caso perché la sintassi della query C# non è legata a LINQ e nel secondo perché è in genere che viene chiamato il concatenamento del metodo). – Richard

risposta

51

No, perché sono compilati nello esattamente lo stesso codice.

Fondamentalmente le espressioni di query sono "preelaborate" dal compilatore in "C# 3 senza espressioni di query" e quindi le regole di sovraccarico, traduzione di espressioni lambda ecc. Vengono applicate normalmente. È un sistema davvero elegante, il che significa che le regole per le espressioni di query sono limitate a un solo piccolo bit della specifica.

Naturalmente, ci sono varie cose che puoi scrivere nella sintassi del "metodo concatenato" che non può essere scritta nella sintassi delle espressioni di query, a causa dell'uso di altri sovraccarichi o dei metodi semplicemente non supportati (es. Count()) - ma a meno che tu non stia usando quelli, il codice compilato sarà esattamente lo stesso. Scegli l'alternativa più leggibile per qualsiasi scenario particolare.

+0

Per completezza, dato che la domanda si riferisce alla performance, può essere prudente menzionare che potrebbero esserci lievi differenze nei tempi di * compilazione * tra le due alternative; la seconda alternativa sarà probabilmente più veloce. – Ani

+6

@Ani: Nella mia esperienza, le domande sulle prestazioni sono molto * molto * raramente sulla velocità di compilazione. Mi aspetto che l'OP a * esplicitamente * specifichi che se è questo che intendeva. Penso che sia ragionevole presumere che "performance" significhi "performance al momento dell'esecuzione", se non diversamente specificato. –

+0

Sono d'accordo. Era solo per completezza. – Ani