Est-ce Linq ou Lambda?

105

Je sais que c'est Linq:

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

Et je sais que c'est Lambda:

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

Note de l'éditeur: ce qui précède n'est pas simplement Lambda, c'est Linq utilisant la "Method Syntax" dont le prédicat est un Lambda. Pour être clair, les deux exemples ci-dessus sont Linq (mon message d'origine était incorrect, mais j'ai laissé l'erreur pour illustrer la confusion qui a suscité la question).

Mais Linq est-il un sous-ensemble de Lambda ou quoi?

Pourquoi y a-t-il deux technologies apparemment identiques?

Y a-t-il une raison technique de choisir l'un plutôt que l'autre?

Jerry Nixon
la source
2
Correction: lambdaexpression.net
Jerry Nixon

Réponses:

135

Voici LINQ (en utilisant la syntaxe de requête):

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

C'est aussi LINQ (en utilisant la syntaxe de la méthode):

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

Il est intéressant de noter que ces deux versions finiront par produire exactement le même code. Le compilateur vous propose un service en vous permettant d'exprimer vos souhaits de la manière que vous préférez.

Et c'est un lambda:

x => x.Value == 1

Lorsque vous choisissez d'utiliser la syntaxe de méthode, LINQ est presque toujours vu autour des expressions lambda. Mais LINQ et lambdas sont deux choses totalement différentes, qui peuvent toutes deux être utilisées par elles-mêmes.

Mise à jour: comme svick le souligne à juste titre, LINQ avec la syntaxe de requête est également implémenté à l'aide d'expressions lambda (comme mentionné précédemment, le compilateur vous permet d'écrire dans la syntaxe de requête mais la transforme efficacement en syntaxe de méthode derrière votre dos). Cela ne fait qu'empiler le fait que les deux saveurs sont totalement équivalentes et se comporteront de la même manière (par exemple, les expressions lambda peuvent provoquer la création de fermetures ).

Jon
la source
2
Je pense qu'il vaut la peine de mentionner que la syntaxe de requête utilise également des lambdas dans les coulisses. Cela peut être important en raison des fermetures.
svick
34

Les deux sont Linq. Le second utilise des Lambdas .

Les lambdas sont les éléments de type de méthode en ligne que vous transmettez en tant que paramètre à la fonction Where dans le deuxième exemple.

La différence entre ces deux syntaxes est purement syntaxique. Le deuxième style linq utilisant des appels de méthode est la façon dont cela fonctionne sous le capot. Le premier est censé être plus convivial / plus facile et le compilateur le convertit en appels de méthode dans les coulisses. Ils devraient fonctionner de la même manière pour n'importe quelle requête donnée, bien que le compilateur puisse bien sûr choisir une interprétation légèrement différente d'une requête linq compliquée que vous le feriez lors de la conversion en style méthode.

Cet article msdn peut également être intéressant: Syntaxe de requête LINQ versus syntaxe de méthode . Il est particulièrement pertinent: "En général, nous recommandons la syntaxe de requête car elle est généralement plus simple et plus lisible; cependant, il n'y a pas de différence sémantique entre la syntaxe de méthode et la syntaxe de requête."

Chris
la source
6
Personnellement, je trouve la syntaxe des méthodes plus lisible - peut-être parce que la plupart de mon code est de la variété "LINQ to Objects". Mais si vous avez beaucoup d'expérience SQL, la syntaxe des requêtes sera peut-être plus facile à comprendre au début.
Tom Bushell
@Tom Bushell, même la syntaxe JOIN? Sérieusement?
Jerry Nixon le
@Tom Bushell: moi aussi. Je paraphrasais quelque chose sur cette page MSDN qui explique probablement pourquoi ils ont pris la peine de développer cette syntaxe plutôt que d'avoir juste le style de méthode. Je fais généralement des trucs relativement basiques plutôt que des jointures ou autre chose de plus compliqué (c'est-à-dire principalement du filtrage ou des opérations de mappage un à un).
Chris
@Jerry - comme Chris, mon travail LINQ a été assez simple jusqu'à présent. J'ai lu que la syntaxe de requête est généralement préférable lorsque vous faites SelectMany, Join ou GroupJoin - je n'ai tout simplement pas besoin de faire quoi que ce soit de tel - pour le moment!
Tom Bushell
1
En interne, la «syntaxe de requête» était appelée «syntaxe de compréhension» dans les équipes LINQ to SQL et LINQ to Entities.
DamienG