Jak: sloučení dat s LINQ pomocí spojení (Visual Basic)
Visual Basic poskytuje Join a Group Join dotazu doložky, které umožňují sloučit obsah více kolekce založené na společných hodnot mezi kolekce.Tyto hodnoty jsou známé jako klíčů hodnoty.Vývojáři, kteří znají konceptů relační databáze rozpozná Join jako INNER JOIN klauzule a Group Join jako efektivní klauzule LEFT OUTER JOIN klauzule.
Příklady v tomto tématu prokázat několika způsoby slučování dat pomocí Join a Group Join klauzule dotazu.
Vytvoření projektu a přidejte ukázková Data
Vytvořit projekt, který obsahuje ukázková data a typy
V tomto tématu spuštění vzorky, otevřete aplikaci Visual Studio a přidat nový projekt aplikace Visual Basic konzoly.Poklepejte na soubor Module1.vb, vytvořený pomocí jazyka Visual Basic.
Ukázky v tomto tématu Person a Pet typy a data z následující příklad kódu.Zkopírujte tento kód do výchozí Module1 modulu vytvořené v jazyce 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
Provádět Inner Join klauzule Join
INNER JOIN kombinuje data z dvou kolekcí.Položky, které odpovídají zadané hodnoty klíče jsou zahrnuty.Položky z jedné kolekce, které nemají odpovídající položku v jiné kolekci jsou vyloučeny.
V jazyce Visual Basic LINQ poskytuje dvě možnosti pro provádění vnitřní spojení: implicitní spojení a explicitní spojení.
Určuje implicitní spojení kolekce zúčastnil From klauzule a identifikuje odpovídající pole klíče v Where klauzule.Visual Basic implicitně spojuje dvě kolekce na základě zadaného pole klíče.
Explicitní spojení můžete zadat pomocí Join klauzuli, pokud chcete být o který klíč pole použít ve spojení.V tomto případě Where klauzule stále možné filtrovat výsledky dotazu.
Chcete-li provádět Inner Join klauzule Join
Přidejte následující kód Module1 modulu projektu uvedeny příklady obou implicitní a explicitní vnitřní spojení.
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
Pomocí klauzule Join skupiny provádět levé vnější spojení
LEFT OUTER JOIN zahrnuje všechny položky z kolekce vlevo spojení a pouze odpovídající hodnoty z kolekce pravé straně spojení.Položky z kolekce vpravo spojení, které nemají odpovídající položku v kolekci vlevo jsou vyloučeny z výsledků dotazu.
Group Join Klauzule provádí v platnosti klauzule LEFT OUTER JOIN.Rozdíl mezi co se obvykle nazývá LEFT OUTER JOIN a co Group Join klauzule vrátí, je Group Join klauzule skupiny výsledků z kolekce spojení pro každou položku v kolekci vlevo vpravo.V relační databázi LEFT OUTER JOIN vrátí neseskupené výsledek, v němž výsledek každé položky v dotazu obsahuje odpovídající položky z kolekce, obě ve spojení.V tomto případě jsou položky z kolekce vlevo spojení opakovat u každé shodné položky z kolekce vpravo.Uvidíte, jak to vypadá po dokončení další postup.
Výsledky můžete načíst Group Join dotazu jako neseskupené výsledek rozšířením dotaz vrátit pro každý výsledek dotazu seskupené položky.K tomu je nutné zajistit při dotazu na DefaultIfEmpty metoda seskupené kolekce.Tím zajistíte, že položky z kolekce vlevo spojení jsou zahrnuty i ve výsledku dotazu i v případě, že nemají žádné odpovídající výsledky z kolekce vpravo.Kód můžete přidat do dotazu, výchozí hodnota výsledkem poskytnout odpovídající hodnota z kolekce vpravo spojení neexistuje.
K provedení klauzule Left Outer Join pomocí klauzule Join skupiny
Přidejte následující kód Module1 modulu projektu na příklady seskupené levé vnější spojení a neseskupené levé vnější spojení.
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
Provést spojení pomocí složeného klíče
Můžete použít And klíčové slovo v Join nebo Group Join klauzule identifikovat více polí klíčů při porovnávání hodnot z kolekce je připojen.And Klíčové slovo určuje, že všechna pole klíče se musí shodovat pro položky, které mají být sloučeny.
Provádění spojení pomocí složený klíč
Přidejte následující kód Module1 modulu projektu uvedeny příklady spojení, které používá složený klíč.
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
Spustit kód
Přidání spuštění příkladů kódu
Nahradit Sub Main v Module1 modulu projektu následující kód pro spuštění příkladů v tomto tématu.
Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Stisknutím klávesy F5 spuštění příkladů.
Viz také
Referenční dokumentace
Klauzule Join skupiny (Visual Basic)
Koncepty
Úvod do jazyka Visual Basic LINQ