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

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

  2. In den Beispielen in diesem Thema werden die Person Typen und Pet Daten aus dem folgenden Codebeispiel verwendet. Kopieren Sie diesen Code in das Standardmodul Module1 , 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

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

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

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

  1. Ersetzen Sie im Sub MainModule1 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
    
  2. Drücken Sie F5, um das Beispiel auszuführen.

Weitere Informationen