Dela via


Anvisningar: Kombinera data med LINQ med hjälp av kopplingar (Visual Basic)

Visual Basic tillhandahåller Join frågesatserna och Group Join så att du kan kombinera innehållet i flera samlingar baserat på vanliga värden mellan samlingarna. Dessa värden kallas för nyckelvärden . Utvecklare som är bekanta med relationsdatabasbegrepp identifierar Join satsen som en INRE KOPPLING och Group Join -satsen som i själva verket en VÄNSTER YTTRE KOPPLING.

Exemplen i det här avsnittet visar några sätt att kombinera data med hjälp av frågesatserna Join och Group Join .

Skapa ett projekt och lägg till exempeldata

Skapa ett projekt som innehåller exempeldata och typer

  1. Om du vill köra exemplen i det här avsnittet öppnar du Visual Studio och lägger till ett nytt Visual Basic Console Application-projekt. Dubbelklicka på den Module1.vb fil som skapats av Visual Basic.

  2. Exemplen i det här avsnittet använder typerna Person och Pet och data från följande kodexempel. Kopiera den här koden till standardmodulen Module1 som skapats av Visual Basic.

    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
    

Utföra en inre koppling med hjälp av kopplingssatsen

En INRE KOPPLING kombinerar data från två samlingar. Objekt som de angivna nyckelvärdena matchar inkluderas för. Objekt från någon av samlingarna som inte har ett matchande objekt i den andra samlingen undantas.

I Visual Basic innehåller LINQ två alternativ för att utföra en INRE KOPPLING: en implicit koppling och en explicit koppling.

En implicit koppling anger vilka samlingar som ska kopplas i en From -sats och identifierar matchande nyckelfält i en Where -sats. Visual Basic kopplar implicit ihop de två samlingarna baserat på de angivna nyckelfälten.

Du kan ange en explicit koppling med hjälp Join av -satsen när du vill vara specifik om vilka nyckelfält som ska användas i kopplingen. I det här fallet kan en Where sats fortfarande användas för att filtrera frågeresultaten.

Så här utför du en inre koppling med hjälp av kopplingssatsen

  1. Lägg till följande kod i modulen Module1 i projektet för att se exempel på både en implicit och explicit inre koppling.

    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
    

Utföra en vänster yttre koppling med hjälp av gruppkopplingssatsen

En VÄNSTER YTTRE KOPPLING innehåller alla objekt från den vänstra samlingen av kopplingen och endast matchande värden från den högra samlingen av kopplingen. Alla objekt från den högra samlingen av kopplingen som inte har något matchande objekt i den vänstra samlingen undantas från frågeresultatet.

- Group Join satsen utför i själva verket en YTTRE VÄNSTERKOPPLING. Skillnaden mellan vad som vanligtvis kallas vänster yttre koppling och vad Group Join satsen returnerar är att Group Join satsen grupper resultat från den högra samlingen av kopplingen för varje objekt i den vänstra samlingen. I en relationsdatabas returnerar en VÄNSTER YTTRE KOPPLING ett ogrupperat resultat där varje objekt i frågeresultatet innehåller matchande objekt från båda samlingarna i kopplingen. I det här fallet upprepas objekten från den vänstra samlingen av kopplingen för varje matchande objekt från den högra samlingen. Du ser hur det ser ut när du slutför nästa procedur.

Du kan hämta resultatet av en Group Join fråga som ett ogrupperat resultat genom att utöka frågan så att den returnerar ett objekt för varje grupperat frågeresultat. För att åstadkomma detta måste du se till att du frågar efter metoden för DefaultIfEmpty den grupperade samlingen. Detta säkerställer att objekt från den vänstra samlingen av kopplingen fortfarande ingår i frågeresultatet även om de inte har några matchande resultat från den högra samlingen. Du kan lägga till kod i frågan för att ange ett standardresultatvärde när det inte finns något matchande värde från den högra samlingen av kopplingen.

Så här utför du en vänster yttre koppling med hjälp av gruppkopplingssatsen

  1. Lägg till följande kod i modulen Module1 i projektet för att se exempel på både en grupperad vänster yttre koppling och en ogrupperad vänster yttre koppling.

    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
    

Utföra en koppling med hjälp av en sammansatt nyckel

Du kan använda nyckelordet And i en Join eller Group Join -sats för att identifiera flera nyckelfält som ska användas när du matchar värden från de samlingar som ansluts. Nyckelordet And anger att alla angivna nyckelfält måste matcha för att objekt ska kunna kopplas.

Så här utför du en koppling med hjälp av en sammansatt nyckel

  1. Lägg till följande kod i modulen Module1 i projektet för att se exempel på en koppling som använder en sammansatt nyckel.

    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
    

Kör koden

Så här lägger du till kod för att köra exemplen

  1. Sub Main Ersätt modulen Module1 i projektet med följande kod för att köra exemplen i det här avsnittet.

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. Tryck på F5 för att köra exemplen.

Se även