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
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.
Exemplen i det här avsnittet använder typerna
Person
ochPet
och data från följande kodexempel. Kopiera den här koden till standardmodulenModule1
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
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
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
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
Sub Main
Ersätt modulenModule1
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
Tryck på F5 för att köra exemplen.