1)
in Schlüsselwort erstellt temporäre Kennung zum Speichern von Join-Ergebnissen, Gruppieren oder Auswählen von Klauseln.
Ich nehme an, into
keyword kann nur als Teil von group , join oder ausgewählten Klauseln verwendet werden?
2)
a) Ich habe gelesen, dass, wenn into
als Teil der Gruppe oder verwendet wird, -Klauseln verwendet wird, und die Abfrage deshalb in zwei Hälften zusammengefügt wird Bereichsvariablen, die in der ersten Hälfte der Abfrage ALWAYS deklariert werden, gehen in der zweiten Hälfte der Abfrage außerhalb des Gültigkeitsbereichs. Korrekt?
b) Aber wenn into
als Teil der join -Klausel verwendet wird, gehen rangle-Variablen NIE innerhalb des Bereichs innerhalb der Abfrage aus (es sei denn, Abfrage enthält auch group...into
oder select...into
) . Ich nehme an, dies liegt daran, dass into
die Abfrage nicht in zwei Hälften spleißt, wenn sie mit der join -Klausel verwendet wird?
c)
Ein Abfrageausdruck besteht aus einer from -Klausel gefolgt von einem optionalen Abfragetext ( from, where, let -Klauseln) und muss entweder mit select von
d) Wenn into
tatsächlich eine Abfrage in zwei Hälften spleißt, ist im folgenden Beispiel group -Klausel Teil des Körpers:
danke
Antwort an Ufuk:
a)
Nach einer Gruppe von dir bekommst du eine Sequenz wie diese IEnumerable & gt;
Gibt ein Operator GroupBy
kein Ergebnis vom Typ IEnumerable<IGrouping<Key,Foo>>
und nicht IEnumerable<Key,IEnumerable<Foo>>
b) Könnten wir nicht argumentieren, dass group...by...into
oder join...into
die Abfrage so spleißen, dass die erste Hälfte der Abfrage zumindest konzeptionell ausgeführt werden muss, bevor die zweite Hälfte der Abfrage ausgeführt werden kann?
Antwort auf Robotsushi:
Je mehr ich darüber nachdenke, desto mehr habe ich das Gefühl, dass meine Frage ziemlich sinnlos ist, da sie keinen praktischen Wert hat. Immer noch ...
Wenn du sagst, dass es gespalten wird. Meinst du den Umfang der Variablen? wird geteilt oder die generierte SQL-Abfrage wird geteilt
Hier ist das Zitat:
In vielen Fällen können die Bereichsvariablen auf einer Seite dieser Teilung nicht sein gemischt mit den Bereichsvariablen auf der anderen Seite. Das Schlüsselwort in das ist ein Teil dieser group-by-Klausel wird verwendet, um die zwei Hälften dieser Abfrage. Als solches markiert es die Grenze in der Mitte der Abfrage, über die Bereichsvariablen typischerweise nicht klettern können. Das Bereichsvariablen oberhalb des Schlüsselworts into gehen im letzten Bereich aus dem Gültigkeitsbereich Teil dieser Abfrage.
Meine Frage ist, ob beide Hälften noch als eine einzige Abfrage betrachtet werden und die gesamte Anfrage daher immer noch aus nur drei Teilen besteht. Wenn das der Fall ist, dann ist in meinem Codebeispiel (unter d)) die Gruppenklausel Teil des Körpers. Wenn jedoch beide Hälften als zwei Abfragen betrachtet werden, besteht jede der beiden Abfragen aus drei Teilen.
2. antworte auf Robotsushi:
Dieser Teil Ihrer Abfrage wird als ein Datenzug ausgewertet.
Ich bin nicht vertraut mit dem Begriff "Daten ziehen", also werde ich raten, dass das, was Sie sagen wollten, ist, dass die erste Hälfte der Abfrage als eine Einheit ausführt / auswertet, und dann die zweite Hälfte der Abfrage nimmt die Ergebnisse aus der ersten Hälfte und nutzt die Ergebnisse in seiner Ausführung / Auswertung? Mit anderen Worten, konzeptionell haben wir zwei Abfragen?
group ... von ... in
A group by
muss nach der Operation eine andere Art von Sequenz bereitstellen.
Sie haben eine Sequenz wie folgt:
%Vor%Nach einer Gruppe von Ihnen erhalten Sie eine Sequenz wie diese
%Vor%Jetzt befinden sich Ihre Elemente in verschachtelten Sequenzen und Sie haben keinen direkten Zugriff darauf. Aus diesem Grund sind Kennungen im ersten Teil nicht verfügbar. Da der erste Teil außerhalb des Gültigkeitsbereichs liegt, bleibt der Bezeichner nach dem in . Es ist beendet und eine neue Abfrage kann beginnen. Ihr zweiter Teil der Abfrage arbeitet in einer völlig anderen Reihenfolge als die erste. Es ist eine Fortsetzung.
%Vor%mach mit ... auf ... in
Auf der anderen Seite ist Gruppen-Join nicht diese Art von Operation. Sie arbeiten mit zwei Sequenzen, bei denen Gruppe für Eins arbeitet. Sie werden übereinstimmende Elemente in der richtigen Reihenfolge für die linke Sequenz bereitstellen.
%Vor%Nach der Operation können Sie den Bezeichner aus der linken Sequenz verwenden, aber der Bezeichner rechts liegt außerhalb des Gültigkeitsbereichs. Das liegt daran, dass Join jetzt eine Sequenz von ihnen zurückgibt. Sie haben also keinen direkten Zugang zu ihnen. Das Ergebnis der Gruppenverbindung ist wie folgt:
%Vor%Wenn Sie Gruppenjoin verwenden, wird nur die rechte Bereichsvariable außerhalb des Bereichs angezeigt. Während der linke Teil noch übrig ist, arbeiten Sie immer noch an der gleichen Sequenz. Sie haben noch keine Projektion bereitgestellt, sodass Sie eine zweite Abfrage nicht fortsetzen können.
%Vor%1) correct ... um spezifischer zu sein, um eine Referenz für die Ergebnisse einer Join-, Gruppen- oder Auswahlklausel zu liefern, die außerhalb des Gültigkeitsbereichs liegt.
2) Ich glaube nicht, dass Ihre Abfrage als Ergebnis der Verwendung von in geteilt wird, da es am häufigsten verwendet wird:
Die Verwendung von in in einer Gruppenklausel ist nur dann notwendig, wenn Sie dies möchten führen Sie zusätzliche Abfrageoperationen für jede Gruppe durch
Antwort hinzugefügt
Ich habe gelesen, dass wenn in als Teil der Gruppe verwendet oder ausgewählt wird Klauseln, es spleißt die Abfrage in zwei Hälften und wegen dieses Bereichs Variablen, die in der ersten Hälfte der Abfrage deklariert sind, gehen IMMER außerhalb des Gültigkeitsbereichs in der zweiten Hälfte der Abfrage. Korrekt?
Dieser Teil Ihrer Abfrage wird als ein Datenzug ausgewertet. Das Gruppenschlüsselwort erfordert eine Sortieroperation, um die Auswertung Ihrer LINQ-Abfrage fortzusetzen:
%Vor%Wählen Sie also im Folgenden:
Wählen Sie ...
Die Variablen aus dem ersten Teil der Abfrage wären zwar ausgewertet worden, aber da Sie das Schlüsselwort in einschließen, können Sie mit den Ergebnissen der Abfrage in select arbeiten, da sie im GroupResult gespeichert sind Variable.
Aber wenn into als Teil der Join-Klausel verwendet wird, rangle Variablen VERLASSEN Sie NIEMALS den Gültigkeitsbereich innerhalb der Abfrage (es sei denn, Sie fragen auch nach enthält Gruppe ... in oder select ... in). Ich nehme an, das ist in Splice der Abfrage in zwei Hälften bei Verwendung mit Join-Klausel?
Die Abfrage wird weiterhin in zwei Teilen ausgewertet. GroupResult gibt Ihnen jedoch Zugriff auf das, was vor dem Schlüsselwort group deklariert wurde.
Ein Abfrageausdruck besteht aus einer from-Klausel gefolgt von optional Abfrage Körper (aus, wo, lassen Sie Klauseln) und muss mit entweder zu beenden Gruppenklausel.
Dies ist eine Definition, keine Frage.
Wenn in der Tat Spleiße in zwei Hälften abfragen, ist im Folgenden Beispiel Gruppenklausel Teil des Körpers:
Die Gruppe ist Teil der ersten Hälfte der Abfrage.
Diese LINQ-Abfrage würde eine SQL-Anweisung generieren, nur für den Fall, dass Sie neugierig sind.
2. Aktualisierung
Ich bin nicht vertraut mit dem Begriff "Daten ziehen", also werde ich das erraten Was Sie sagen wollten, ist die erste Hälfte der Abfrage Führt / wertet als eine Einheit aus und nimmt dann die zweite Hälfte der Abfrage an die Ergebnisse aus der ersten Hälfte und nutzt die Ergebnisse in seiner Ausführung / Auswertung? Mit anderen Worten, konzeptionell haben wir zwei Fragen?
Ja, es gibt zwei verschiedene Teile der Abfrage.