Gewusst wie: Kombinieren von Daten mit LINQ mithilfe von Joins (Visual Basic)
Visual Basic stellt die Join
-Klauseln und Group Join
-Klauseln bereit, mit denen Sie den Inhalt mehrerer Sammlungen basierend auf gemeinsamen Werten zwischen den Sammlungen kombinieren können. Diese Werte werden als Schlüsselwerte bezeichnet. Entwickler, die mit relationalen Datenbankkonzepten vertraut sind, erkennen die Join
-Klausel als INNER JOIN und die Group Join
-Klausel als links-ÄUßERE VERKNÜPFUNG.
Die Beispiele in diesem Thema veranschaulichen einige Möglichkeiten zum Kombinieren von Daten mithilfe der Abfrageklauseln und Join
der Group Join
Abfrageklauseln.
Erstellen eines Projekts und Hinzufügen von Beispieldaten
So erstellen Sie ein Projekt, das Beispieldaten und -typen enthält
Um die Beispiele in diesem Thema auszuführen, öffnen Sie Visual Studio, und fügen Sie ein neues Visual Basic-Konsolenanwendungsprojekt hinzu. Doppelklicken Sie auf die Datei Module1.vb, die von Visual Basic erstellt wurde.
In den Beispielen in diesem Thema werden die
Person
Typen undPet
Daten aus dem folgenden Codebeispiel verwendet. Kopieren Sie diesen Code in das StandardmodulModule1
, das von Visual Basic erstellt wurde.Private _people As List(Of Person) Private _pets As List(Of Pet) Function GetPeople() As List(Of Person) If _people Is Nothing Then CreateLists() Return _people End Function Function GetPets(ByVal people As List(Of Person)) As List(Of Pet) If _pets Is Nothing Then CreateLists() Return _pets End Function Private Sub CreateLists() Dim pers As Person _people = New List(Of Person) _pets = New List(Of Pet) pers = New Person With {.FirstName = "Magnus", .LastName = "Hedlund"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Daisy", .Owner = pers}) pers = New Person With {.FirstName = "Terry", .LastName = "Adams"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Barley", .Owner = pers}) _pets.Add(New Pet With {.Name = "Boots", .Owner = pers}) _pets.Add(New Pet With {.Name = "Blue Moon", .Owner = pers}) pers = New Person With {.FirstName = "Charlotte", .LastName = "Weiss"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Whiskers", .Owner = pers}) ' Add a person with no pets for the sake of Join examples. _people.Add(New Person With {.FirstName = "Arlene", .LastName = "Huff"}) pers = New Person With {.FirstName = "Don", .LastName = "Hall"} ' Do not add person to people list for the sake of Join examples. _pets.Add(New Pet With {.Name = "Spot", .Owner = pers}) ' Add a pet with no owner for the sake of Join examples. _pets.Add(New Pet With {.Name = "Unknown", .Owner = New Person With {.FirstName = String.Empty, .LastName = String.Empty}}) End Sub
Class Person Public Property FirstName As String Public Property LastName As String End Class Class Pet Public Property Name As String Public Property Owner As Person End Class
Ausführen einer inneren Verknüpfung mithilfe der Join-Klausel
Ein INNER JOIN kombiniert Daten aus zwei Sammlungen. Elemente, für die die angegebenen Schlüsselwerte übereinstimmen, sind enthalten. Alle Elemente aus beiden Auflistungen, die kein übereinstimmende Element in der anderen Auflistung enthalten, werden ausgeschlossen.
In Visual Basic bietet LINQ zwei Optionen zum Ausführen eines INNER JOIN: eine implizite Verknüpfung und eine explizite Verknüpfung.
Ein impliziter Join gibt die Auflistungen an, die in eine From
Klausel eingebunden werden sollen, und identifiziert die übereinstimmenden Schlüsselfelder in einer Where
Klausel. Visual Basic verknüpft die beiden Sammlungen implizit basierend auf den angegebenen Schlüsselfeldern.
Sie können eine explizite Verknüpfung mithilfe der Join
-Klausel angeben, wenn Sie festlegen möchten, welche Schlüsselfelder in der Verknüpfung verwendet werden sollen. In diesem Fall kann weiterhin eine Where
Klausel verwendet werden, um die Abfrageergebnisse zu filtern.
Ausführen einer inneren Verknüpfung mithilfe der Join-Klausel
Fügen Sie dem Modul in Ihrem Projekt den
Module1
folgenden Code hinzu, um Beispiele für eine implizite und explizite innere Verknüpfung anzuzeigen.Sub InnerJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people, pet In pets Where pet.Owner Is pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Explicit Join. Dim petOwnersJoin = From pers In people Join pet In pets On pet.Owner Equals pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. output = New System.Text.StringBuilder() For Each pers In petOwnersJoin output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Both queries produce the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
Ausführen einer linken äußeren Verknüpfung mithilfe der Gruppenbeitrittsklausel
Ein LEFT OUTER JOIN enthält alle Elemente aus der linken Auflistung des Joins und nur übereinstimmende Werte aus der rechten Auflistung des Joins. Alle Elemente aus der rechten Auflistung des Joins, die kein übereinstimmende Element in der linken Auflistung enthalten, werden vom Abfrageergebnis ausgeschlossen.
Die Group Join
-Klausel führt tatsächlich einen LEFT OUTER JOIN aus. Der Unterschied zwischen dem, was normalerweise als LEFT OUTER JOIN bezeichnet wird, und dem, was die Group Join
-Klausel zurückgibt, besteht darin, dass die Group Join
Klauselgruppen aus der rechten Auflistung der Verknüpfung für jedes Element in der linken Auflistung resultieren. In einer relationalen Datenbank gibt ein LEFT OUTER JOIN ein nicht gruppiertes Ergebnis zurück, in dem jedes Element im Abfrageergebnis übereinstimmende Elemente aus beiden Auflistungen im Join enthält. In diesem Fall werden die Elemente aus der linken Auflistung der Verknüpfung für jedes übereinstimmende Element aus der rechten Auflistung wiederholt. Wie dies aussieht, sehen Sie, wenn Sie das nächste Verfahren abschließen.
Sie können die Ergebnisse einer Group Join
-Abfrage als nicht gruppiertes Ergebnis abrufen, indem Sie Ihre Abfrage erweitern, um ein Element für jedes gruppierte Abfrageergebnis zurückzugeben. Um dies zu erreichen, müssen Sie sicherstellen, dass Sie die DefaultIfEmpty
Methode der gruppierten Auflistung abfragen. Dadurch wird sichergestellt, dass Elemente aus der linken Auflistung der Verknüpfung weiterhin im Abfrageergebnis enthalten sind, auch wenn sie keine übereinstimmenden Ergebnisse aus der rechten Auflistung aufweisen. Sie können Ihrer Abfrage Code hinzufügen, um einen Standardwert für das Ergebnis bereitzustellen, wenn kein übereinstimmenden Wert aus der rechten Auflistung der Verknüpfung vorhanden ist.
Ausführen einer linken äußeren Verknüpfung mithilfe der Gruppenbeitrittsklausel
Fügen Sie dem
Module1
-Modul in Ihrem Projekt den folgenden Code hinzu, um Beispiele für eine gruppierte linke äußere Verknüpfung und eine nicht gruppierte linke äußere Verknüpfung anzuzeigen.Sub LeftOuterJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Grouped results. Dim petOwnersGrouped = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group Select pers.FirstName, pers.LastName, PetList ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwnersGrouped output.AppendFormat(pers.FirstName & ":" & vbCrLf) For Each pt In pers.PetList output.AppendFormat(vbTab & pt.Name & vbCrLf) Next Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: ' Daisy ' Terry: ' Barley ' Boots ' Blue Moon ' Charlotte: ' Whiskers ' Arlene: ' "Flat" results. Dim petOwners = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group From pet In PetList.DefaultIfEmpty() Select pers.FirstName, pers.LastName, PetName = If(pet Is Nothing, String.Empty, pet.Name) ' Display "flat" results. output = New System.Text.StringBuilder() For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output.ToString()) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers ' Arlene: End Sub
Ausführen einer Verknüpfung mithilfe eines zusammengesetzten Schlüssels
Sie können die And
Schlüsselwort (keyword) in einer Join
- oder Group Join
-Klausel verwenden, um mehrere Schlüsselfelder zu identifizieren, die beim Abgleich von Werten aus den verknüpften Sammlungen verwendet werden sollen. Die And
Schlüsselwort (keyword) gibt an, dass alle angegebenen Schlüsselfelder übereinstimmen müssen, damit Elemente verknüpft werden können.
Ausführen einer Verknüpfung mithilfe eines zusammengesetzten Schlüssels
Fügen Sie dem Modul in Ihrem Projekt den
Module1
folgenden Code hinzu, um Beispiele für eine Verknüpfung anzuzeigen, die einen zusammengesetzten Schlüssel verwendet.Sub CompositeKeyJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people Join pet In pets On pet.Owner.FirstName Equals pers.FirstName And pet.Owner.LastName Equals pers.LastName Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
Ausführen des Codes
So fügen Sie Code zum Ausführen der Beispiele hinzu
Ersetzen Sie im
Sub Main
Module1
Modul in Ihrem Projekt durch den folgenden Code, um die Beispiele in diesem Thema auszuführen.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Drücken Sie F5, um das Beispiel auszuführen.