¿Es Linq o Lambda?

105

Sé que este es Linq:

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

Y sé que esto es Lambda:

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

Nota del editor: lo anterior no es simplemente Lambda, es Linq usando la "Sintaxis del método" cuyo predicado es un Lambda. Para ser claros, las dos muestras anteriores 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?

¿Existe una razón técnica para elegir uno sobre el otro?

Jerry Nixon
fuente
2
Corrección: lambdaexpression.net
Jerry Nixon

Respuestas:

135

Esto es LINQ (usando la sintaxis de consulta):

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

Esto también es LINQ (usando la sintaxis del método):

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

Es interesante notar que ambos sabores terminarán produciendo exactamente el mismo código. El compilador le ofrece un servicio permitiéndole expresar sus deseos de la manera que prefiera.

Y esta es una lambda:

x => x.Value == 1

Cuando elige usar la sintaxis del método, LINQ casi siempre se ve alrededor de expresiones lambda. Pero LINQ y lambdas son dos cosas totalmente diferentes, las cuales pueden usarse por sí mismas.

Actualización: como señala acertadamente svick, LINQ con sintaxis de consulta también se implementa mediante expresiones lambda (como se mencionó anteriormente, el compilador le permite escribir en sintaxis de consulta pero la transforma de manera efectiva en sintaxis de método a sus espaldas). Esto solo se suma al 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 creen cierres ).

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

Ambos son Linq. El segundo está usando Lambdas .

Lambdas son los elementos de tipo de método en línea que está pasando como 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 a métodos es cómo funciona bajo el capó. El primero está destinado a ser más fácil de usar y el compilador lo convierte en llamadas a métodos 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 ligeramente diferente de una consulta de linq complicada de la que haría al convertir al estilo de método.

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

Chris
fuente
6
Personalmente, encuentro la sintaxis del método 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 en SQL, quizás la sintaxis de la consulta sea más fácil de entender al principio.
Tom Bushell
@Tom Bushell, ¿incluso la sintaxis JOIN? ¿Seriamente?
Jerry Nixon
@Tom Bushell: yo también. Estaba parafraseando algo en esa página de MSDN que presumiblemente explica por qué se molestaron en desarrollar esa sintaxis en lugar de tener solo el estilo del método. Por lo general, estoy haciendo cosas relativamente básicas en lugar de uniones o cualquier otra cosa más complicada (es decir, principalmente operaciones de filtrado o de mapeo uno a uno).
Chris
@Jerry: como Chris, mi trabajo con LINQ ha sido bastante simple hasta ahora. He leído que la sintaxis de consulta suele ser preferible al hacer SelectMany, Join o GroupJoin; simplemente no he necesitado hacer nada como eso, ¡todavía!
Tom Bushell
1
Internamente, en los equipos LINQ to SQL y LINQ to Entities se hacía referencia a la "sintaxis de consulta" como "sintaxis de comprensión".
DamienG