Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Visual Basic stellt die Join Klauseln und Group Join Abfrageklauseln bereit, mit denen Sie den Inhalt mehrerer Auflistungen basierend auf gemeinsamen Werten zwischen den Auflistungen kombinieren können. Diese Werte werden als Schlüsselwerte bezeichnet. Entwickler, die mit relationalen Datenbankkonzepten vertraut sind, erkennen die Join Bedingung als INNER JOIN und die Group Join Bedingung effektiv als LEFT OUTER JOIN.
Die Beispiele in diesem Thema veranschaulichen einige Möglichkeiten zum Kombinieren von Daten mithilfe der Join Klauseln und 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 von Visual Basic erstellte Module1.vb Datei.
In den Beispielen in diesem Thema werden die
PersonTypen undPetDaten aus dem folgenden Codebeispiel verwendet. Kopieren Sie diesen Code in das Standardmodul,Module1das 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 SubClass 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 die Daten aus zwei Sammlungen. Elemente, für die die angegebenen Schlüsselwerte übereinstimmen, sind enthalten. Alle Elemente aus beiden Auflistungen, die nicht über ein übereinstimmenes Element in der anderen Auflistung verfügen, werden ausgeschlossen.
In Visual Basic bietet LINQ zwei Optionen zum Ausführen einer INNER JOIN: eine implizite Verknüpfung und eine explizite Verknüpfung.
Eine implizite Verknüpfung gibt die Auflistungen an, die in einer From Klausel verknüpft werden sollen, und identifiziert die übereinstimmenden Schlüsselfelder in einer Where Klausel. Visual Basic verknüpft implizit die beiden Auflistungen basierend auf den angegebenen Schlüsselfeldern.
Sie können eine explizite Verknüpfung angeben, indem Sie die Join Klausel verwenden, wenn Sie spezifisch sein möchten, welche Schlüsselfelder in der Verknüpfung verwendet werden sollen. In diesem Fall kann eine Where Klausel weiterhin verwendet werden, um die Abfrageergebnisse zu filtern.
Ausführen einer inneren Verknüpfung mithilfe der Join-Klausel
Fügen Sie dem
Module1Modul in Ihrem Projekt den 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 der Verknüpfung, die nicht über ein übereinstimmenes Element in der linken Auflistung verfügen, werden vom Abfrageergebnis ausgeschlossen.
Die Group Join-Klausel führt tatsächlich einen LEFT OUTER JOIN aus. Der Unterschied zwischen dem, was in der Regel als LEFT OUTER JOIN bezeichnet wird, und dem, was die Group Join-Klausel zurückgibt, besteht darin, dass die Group Join-Klausel die Ergebnisse aus der rechten Auflistung der Verknüpfung für jedes Element in der linken Auflistung zusammenfasst. In einer relationalen Datenbank gibt eine LEFT OUTER JOIN ein nicht gruppiertes Ergebnis zurück, in dem jedes Element im Abfrageergebnis übereinstimmende Elemente aus beiden Auflistungen in der Verknüpfung 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. Sie sehen, wie dies aussieht, wenn Sie das nächste Verfahren abschließen.
Sie können die Ergebnisse einer Group Join Abfrage als nicht gruppiertes Ergebnis abrufen, indem Sie Die Abfrage erweitern, um ein Element für jedes gruppierte Abfrageergebnis zurückzugeben. Dazu müssen Sie sicherstellen, dass Sie die DefaultIfEmpty Methode der gruppierten Auflistung abfragen. Dadurch wird sichergestellt, dass Elemente aus der linken Sammlung 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
Module1Modul 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 das And Schlüsselwort in einer Join- oder Group Join-Klausel verwenden, um mehrere Schlüsselfelder zu identifizieren, die beim Vergleich von Werten aus den verknüpften Sammlungen verwendet werden sollen. Das And Schlüsselwort gibt an, dass alle angegebenen Schlüsselfelder übereinstimmen müssen, damit Elemente verknüpft werden.
Ausführen einer Verknüpfung mithilfe eines zusammengesetzten Schlüssels
Fügen Sie dem
Module1Modul in Ihrem Projekt den 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
Code ausführen
Um Code zum Ausführen der Beispiele hinzuzufügen
Ersetzen Sie das
Sub MainimModule1Modul in Ihrem Projekt durch den folgenden Code, um die Beispiele in diesem Thema auszuführen.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End SubDrücken Sie F5, um die Beispiele auszuführen.