2010-09-23 13 views
39

¿Hay alguna diferencia de rendimiento entre las dos afirmaciones siguientes?.NET LINQ consulta sintaxis vs método cadena

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

y

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

En general, hay alguna diferencia de rendimiento entre la sintaxis LINQ y la cadena método?

+1

Más correctamente es "expresión de comprensión", y "interfaz fluida" (en el primer caso porque la sintaxis de consulta C# no está vinculada a LINQ, y en este último porque generalmente se llama el método de encadenamiento). – Richard

Respuesta

51

No, porque están compilados en exactamente el mismo código.

Básicamente las expresiones de consulta son "pre-procesadas" por el compilador en "C# 3 sin expresiones de consulta" y luego las reglas de sobrecarga, traducción de expresiones lambda, etc. se aplican de forma normal. Es un sistema realmente elegante, lo que significa que las reglas para las expresiones de consulta están limitadas a solo un pequeño fragmento de la especificación.

Por supuesto, hay varias cosas que puede escribir en la sintaxis de "método encadenado" que no se puede escribir en la sintaxis de la expresión de consulta, ya sea porque usa otras sobrecargas o porque simplemente no se admite (por ejemplo, Count()), pero a menos que los uses, el código compilado será exactamente el mismo. Elija la alternativa más legible para cualquier escenario en particular.

+0

Para completar, dado que la pregunta se relaciona con el rendimiento, puede ser prudente mencionar que puede haber diferencias menores en * tiempos de compilación * entre las dos alternativas; la segunda alternativa probablemente sea más rápida. – Ani

+6

@Ani: En mi experiencia, las preguntas sobre el rendimiento son muy * muy * raras sobre la velocidad de compilación. Esperaría que el OP * especifique * explícitamente si eso es lo que quería decir. Creo que es razonable suponer que "rendimiento" significa "rendimiento en tiempo de ejecución" a menos que se indique lo contrario. –

+0

Estoy de acuerdo. Fue solo por completitud. – Ani