Sdílet prostřednictvím


Postupy: Kombinace 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

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

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

  1. 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
    
  2. Stisknutím klávesy F5 spuštění příkladů.

Viz také

Referenční dokumentace

Join – klauzule (Visual Basic)

Group Join – klauzule (Visual Basic)

From – klauzule (Visual Basic)

Where – klauzule (Visual Basic)

Koncepty

Představení technologie LINQ v jazyce Visual Basic

Transformace dat pomocí LINQ (C#)

Další zdroje

LINQ v jazyce Visual Basic

Dotazy (Visual Basic)