Ich aktualisiere gerade LINQ und versuche, den Unterschied zwischen dem let
und dem into
Schlüsselwort zu verstehen . Bisher let
scheint das into
Schlüsselwort meines Wissens besser zu sein als das Schlüsselwort.
Das into
Schlüsselwort ermöglicht es im Wesentlichen, eine Abfrage nach einer Projektion fortzusetzen. (Ich möchte nur ausdrücklich darauf hinweisen, dass ich mich nicht auf die für den Gruppenbeitritt beziehe.)
Bei einer Reihe von Namen kann man Folgendes tun:
var intoQuery =
from n in names
select Regex.Replace(n, "[aeiou]", "")
into noVowel
where noVowel.Length > 2
select noVowel;
Es nimmt das Ergebnis der Auswahl und legt sie in die noVowel
Variable , die dann eine weitere einführen können where
, orderby
und select
Klauseln. Sobald die noVowel
Variable erstellt wurde, n
ist sie nicht mehr verfügbar.
Das let
Schlüsselwort verwendet dagegen temporäre anonyme Typen, damit Sie mehr als eine Variable gleichzeitig wiederverwenden können.
Sie können Folgendes tun:
var letQuery =
from n in names
let noVowel = Regex.Replace(n, "[aeiou]", "")
where noVowel.Length > 2
select noVowel;
Sowohl die noVowel
als auch die n
Variablen stehen zur Verwendung zur Verfügung (obwohl ich sie in diesem Fall nicht verwendet habe).
Obwohl ich den Unterschied sehen kann, kann ich nicht ganz verstehen, warum man das into
Schlüsselwort über dem let
Schlüsselwort verwenden möchte, es sei denn, man wollte ausdrücklich sicherstellen, dass vorherige Variablen in späteren Teilen der Abfrage nicht verwendet werden konnten.
Gibt es einen guten Grund, warum beide Schlüsselwörter existieren?
let
Beispiel -where noVowel
was istnoVowel
in diesem Fall?Antworten:
Ja, weil sie verschiedene Dinge tun, wie Sie gesagt haben.
select ... into
Isoliert effektiv die gesamte Abfrage und lässt Sie sie als Eingabe für eine neue Abfrage verwenden. Persönlich bevorzuge ich dies normalerweise über zwei Variablen:(Zugegeben, in diesem Fall würde ich es mit Punktnotation in zwei Zeilen machen, aber das ignorieren ...)
Oft möchten Sie nicht das gesamte Gepäck des früheren Teils der Abfrage - wenn Sie
select ... into
die Abfrage gemäß dem obigen Beispiel verwenden oder in zwei Teile teilen. Dies bedeutet nicht nur, dass die früheren Teile der Abfrage nicht verwendet werden können, wenn sie nicht verwendet werden sollten, sondern vereinfacht auch die Vorgänge - und bedeutet natürlich, dass bei jedem Schritt möglicherweise weniger kopiert wird.Auf der anderen Seite ist es sinnvoller , wenn Sie den Rest des Kontexts beibehalten möchten
let
.quelle
Der Hauptunterschied besteht darin, dass die
let
Variable in den Kontext / Bereich eingefügt wird, wointo
ein neuer Kontext / Bereich erstellt wird.quelle
Um den Unterschied auf der DB-Seite zu erfahren, wurden 2 Entity Framework-Abfragen geschrieben.
Lassen
In
Die generierten SQLs sind nahezu identisch . Die SQL ist nicht perfekt, der gleiche String-Prozesscode wird an zwei Stellen wiederholt (wo und auswählen).
Hier ist das von LINQ-to-SQL generierte SQL
Linq-to-SQL ist anscheinend intelligenter als Entity Framework. Der Zeichenfolgenprozess wird nur einmal ausgeführt.
quelle
Visualisierte Version von Leppies Antwort . Wie zu sehen ist, gibt der Compiler einen Fehler in der Abfrage aus, wobei im
into
Gegensatz zu letzterem der Zugriff auf die erste Variable erfolgt.quelle