Ist es Linq oder Lambda?

105

Ich weiß, dass dies Linq ist:

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

Und ich weiß, das ist Lambda:

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

Anmerkung des Herausgebers: Das Obige ist nicht nur Lambda, sondern Linq unter Verwendung der "Methodensyntax", deren Prädikat ein Lambda ist. Um klar zu sein, beide oben genannten Beispiele sind Linq (mein ursprünglicher Beitrag war falsch, aber ich habe den Fehler hinterlassen, um die Verwirrung zu veranschaulichen, die die Frage aufwirft).

Aber ist Linq eine Untergruppe von Lambda oder was?

Warum gibt es zwei scheinbar identische Techniker?

Gibt es einen technischen Grund, sich für einen anderen zu entscheiden?

Jerry Nixon
quelle
2
Korrektur: lambdaexpression.net
Jerry Nixon

Antworten:

135

Dies ist LINQ (unter Verwendung der Abfragesyntax):

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

Dies ist auch LINQ (unter Verwendung der Methodensyntax):

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

Es ist interessant festzustellen, dass diese beiden Geschmacksrichtungen am Ende genau denselben Code produzieren. Der Compiler bietet Ihnen einen Service, indem er es Ihnen ermöglicht, Ihre Wünsche in der von Ihnen bevorzugten Weise auszudrücken.

Und das ist ein Lambda:

x => x.Value == 1

Wenn Sie sich für die Methodensyntax entscheiden, wird LINQ fast immer um Lambda-Ausdrücke herum angezeigt. Aber LINQ und Lambdas sind zwei völlig verschiedene Dinge, die beide für sich verwendet werden können.

Update: Wie svick zu Recht hervorhebt, wird LINQ mit Abfragesyntax auch mithilfe von Lambda-Ausdrücken implementiert (wie bereits erwähnt, können Sie mit dem Compiler die Abfragesyntax schreiben, diese jedoch effektiv hinter Ihrem Rücken in Methodensyntax umwandeln). Dies beruht nur auf der Tatsache, dass beide Geschmacksrichtungen völlig gleichwertig sind und sich gleich verhalten (z. B. können Lambda-Ausdrücke dazu führen, dass Verschlüsse erstellt werden).

Jon
quelle
2
Ich denke, es ist erwähnenswert, dass die Abfragesyntax auch hinter den Kulissen Lambdas verwendet. Dies kann aufgrund von Verschlüssen wichtig sein.
Svick
34

Beide sind Linq. Der zweite benutzt Lambdas .

Lambdas sind Dinge vom Typ Inline-Methode, die Sie im zweiten Beispiel als Parameter an die Where-Funktion übergeben.

Der Unterschied zwischen diesen beiden Syntaxen ist rein syntaktisch. Der zweite Linq-Stil, der Methodenaufrufe verwendet, ist die Funktionsweise unter der Haube. Der erste soll benutzerfreundlicher / einfacher sein und der Compiler konvertiert ihn hinter den Kulissen in Methodenaufrufe. Sie sollten für jede Abfrage gleich funktionieren, obwohl der Compiler natürlich eine etwas andere Interpretation einer komplizierten Linq-Abfrage wählen kann als bei der Konvertierung in den Methodenstil.

Dieser msdn-Artikel könnte auch von Interesse sein: LINQ-Abfragesyntax versus Methodensyntax . Von besonderer Relevanz ist: "Im Allgemeinen empfehlen wir die Abfragesyntax, da sie normalerweise einfacher und besser lesbar ist. Es gibt jedoch keinen semantischen Unterschied zwischen Methodensyntax und Abfragesyntax."

Chris
quelle
6
Persönlich finde ich die Methodensyntax besser lesbar - vielleicht weil der größte Teil meines Codes von der Sorte "LINQ to Objects" ist. Wenn Sie jedoch viel Erfahrung mit SQL haben, ist die Abfragesyntax möglicherweise zunächst einfacher zu verstehen.
Tom Bushell
@ Tom Bushell, sogar JOIN-Syntax? Ernsthaft?
Jerry Nixon
@ Tom Bushell: Ich auch. Ich habe etwas auf dieser MSDN-Seite paraphrasiert, was vermutlich erklärt, warum sie sich die Mühe gemacht haben, diese Syntax zu entwickeln, anstatt nur den Methodenstil zu haben. Normalerweise mache ich nur relativ einfache Dinge anstatt Verknüpfungen oder etwas anderes, das komplizierter ist (dh meistens Filterung oder Eins-zu-Eins-Mapping-Operationen).
Chris
@ Jerry - wie Chris war meine LINQ-Arbeit bisher ziemlich einfach. Ich habe gelesen, dass die Abfragesyntax normalerweise bei SelectMany, Join oder GroupJoin vorzuziehen ist - ich musste so etwas einfach noch nicht tun - noch nicht!
Tom Bushell
1
Intern wurde "Abfragesyntax" in LINQ to SQL- und LINQ to Entities-Teams als "Verständnissyntax" bezeichnet.
DamienG