Probleme beim Verständnis des Linq INTO-Schlüsselworts

8

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 Gruppe -Klausel.

d) Wenn into tatsächlich eine Abfrage in zwei Hälften spleißt, ist im folgenden Beispiel group -Klausel Teil des Körpers:

%Vor%

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>>

zurück

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?

    
user702769 11.09.2011, 17:55
quelle

2 Antworten

3

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%     
Ufuk Hacıoğulları 11.09.2011, 20:21
quelle
1

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.

    
BentOnCoding 11.09.2011 19:43
quelle

Tags und Links