2011-09-12 34 views
81

Sé que esto es LINQ:¿Es Linq o Lambda?

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

Y sé que esto es Lambda: Nota

var _Results = _List.Where(x => x.Value == 1); 

del editor: lo anterior no es meramente Lambda, es LINQ utilizando el " Método Sintaxis "cuyo predicado es un Lambda. Para que quede claro, las dos muestras anteriores de son Linq (mi publicación original era incorrecta, pero dejé el error para ilustrar la confusión que provocó la pregunta).

¿Pero es Linq un subconjunto de Lambda o qué?

¿Por qué hay dos técnicos aparentemente idénticos?

¿Hay alguna razón técnica para elegir una sobre la otra?

+2

Corrección: http://www.lambdaexpression.net/ –

Respuesta

112

Ésta es LINQ (utilizando la sintaxis de consulta):

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

Ésta es también LINQ (utilizando la sintaxis de método):

var _Results = _List.Where(x => x.Value == 1); 

Es interesante observar que both of these flavors acabará produciendo exactamente el mismo código. El compilador le ofrece un servicio al permitirle expresar sus deseos de la manera que prefiera.

Y este es un lambda:

x => x.Value == 1 

Cuando usted elige utilizar la sintaxis de método, LINQ se ve casi siempre en torno a las expresiones lambda. Pero LINQ y lambdas son dos cosas totalmente diferentes, ambas pueden usarse por sí mismas.

Actualización: Como svick señala con razón, LINQ con la sintaxis de consulta es también implementarse usando expresiones lambda (como se mencionó anteriormente, el compilador le permite escribir en la sintaxis de la consulta, pero se transforma de manera efectiva a la sintaxis método detrás de su espalda) Esto simplemente está acumulando el hecho de que ambos sabores son totalmente equivalentes y se comportarán de la misma manera (por ejemplo, las expresiones lambda pueden hacer que se cree closures).

+2

Creo que vale la pena mencionar que la sintaxis de la consulta también usa lambdas detrás de escena. Esto puede ser importante debido a los cierres. – svick

+0

@svick: De hecho, respuesta actualizada. – Jon

30

Ambos son Linq. El segundo es usandoLambdas.

Lambdas son los métodos de tipo en línea que está pasando como un parámetro a la función Where en el segundo ejemplo.

La diferencia entre esas dos sintaxis es puramente sintáctica. El segundo estilo de linq que usa llamadas de método es cómo funciona debajo del capó. El primero está destinado a ser más amigable/fácil de usar y el compilador lo convierte en llamadas de método detrás de escena. Deberían funcionar de la misma manera para cualquier consulta dada, aunque, por supuesto, el compilador puede elegir una interpretación levemente diferente de una consulta complicada de linq que la que haría al convertir al estilo de método.

Este artículo msdn también puede ser de interés: LINQ Query Syntax versus Method Syntax. De especial relevancia es: "En general, recomendamos la sintaxis de consulta porque generalmente es más simple y más legible, sin embargo, no hay una diferencia semántica entre la sintaxis del método y la sintaxis de la consulta".

+1

+1 para la recomendación de MSDN. –

+4

Personalmente, encuentro que la sintaxis de los métodos es más legible, quizás porque la mayor parte de mi código es de la variedad "LINQ to Objects". Pero si tiene mucha experiencia SQL, quizás la sintaxis de la consulta sea más fácil de entender al principio. –

+0

@Tom Bushell, incluso la sintaxis JOIN? ¿Seriamente? –