Udostępnij za pośrednictwem


Jak: łączenie danych z LINQ za pomocą sprzężenia (Visual Basic)

Visual Basic zapewnia Join i Group Join kwerendy klauzul umożliwiających łączenie zawartości wielu kolekcje oparte na wspólnych wartości między kolekcje.Wartości te są znane jako klucz wartości.Deweloperzy zaznajomieni z koncepcji relacyjnych baz danych będzie rozpoznawać Join klauzulę INNER JOIN oraz Group Join klauzuli, jak skutecznie, LEFT OUTER JOIN.

W tym temacie przykładowe kilka sposobów łączenia danych za pomocą Join i Group Join klauzule kwerendy.

Tworzenie projektu i Dodaj dane przykładowe

Aby utworzyć projekt zawierający dane przykładowe i typów

  1. Aby uruchomić przykłady w tym temacie, otwórz program Visual Studio i dodać nowy projekt aplikacji konsoli Visual Basic.Kliknij dwukrotnie plik Module1.vb, utworzony przez program Visual Basic.

  2. Próbki, w tym temacie Person i Pet typów i danych w poniższym przykładzie kodu.Skopiuj ten kod do domyślnej Module1 moduł utworzony przez program 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
    

Wykonać Inner Join przy użyciu klauzuli Join

Operacji INNER JOIN łączy dane z dwóch zbiorów.Elementy, dla których odpowiada określonej wartości klucza są uwzględniane.Wszystkie elementy z kolekcji albo, które nie ma pasującego elementu w kolekcji inne są wyłączone.

W języku Visual Basic LINQ udostępnia dwie opcje służące do wykonywania sprzężenie wewnętrzne: sprzężenie niejawna i jawnego sprzężenia.

Sprzężenie niejawne określa kolekcje, które mają zostać połączone From klauzuli i identyfikuje pasujące pola klucza w Where klauzuli.Visual Basic niejawnie łączy dwie kolekcje oparte na określonych pól klucza.

Jawnego sprzężenia można określić za pomocą Join klauzuli, gdy użytkownik chce precyzyjnie, który klucz pola należy używać w sprzężeniu.W tym przypadku Where klauzula nadal może służyć do filtrowania wyników kwerendy.

Do wykonywania operacji Inner Join, przy użyciu klauzuli Join

  • Dodaj następujący kod do Module1 moduł w projekcie, aby zobaczyć przykłady zarówno niejawnym i jawnym sprzężenie wewnętrzne.

    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
    

Wykonać lewe sprzężenie zewnętrzne przy użyciu klauzuli Join grupy

LEFT OUTER JOIN zawiera wszystkie elementy z kolekcji po lewej stronie, sprzężenia, a tylko pasujące wartości z kolekcji prawej strony sprzężenia.Wszystkie elementy z kolekcji po prawej stronie sprzężenia, które nie mają pasującego elementu w kolekcji po lewej stronie są wykluczone z wyniku kwerendy.

Group Join Klauzuli wykonuje w efekcie LEFT OUTER JOIN.Różnica między zwykle określane jako LEFT OUTER JOIN i co Group Join klauzuli zwraca się, że Group Join klauzuli grup wyników z kolekcji po prawej stronie sprzężenia dla każdego elementu w kolekcji po lewej stronie.W relacyjnej bazie danych LEFT OUTER JOIN zwraca wynik niegrupowanej powoduje każdego elementu w kwerendzie zawiera pasujące przedmioty ze zbiorów, zarówno w sprzężeniu.W przypadku elementów z kolekcji po lewej stronie sprzężenia są powtarzane dla każdego pasującego elementu z kolekcji po prawej stronie.Zostanie wyświetlony, jak to wygląda po wykonaniu kolejnej procedury.

Można pobrać wyników Group Join kwerendy w wyniku rozgrupowany, rozszerzając kwerendy do zwrotu towaru, dla każdego wyniku kwerendy zgrupowanej.Aby osiągnąć ten cel, mają zapewnić, że wykonywana jest kwerenda na DefaultIfEmpty metody zbierania zgrupowane.Gwarantuje to, że elementy z kolekcji po lewej stronie sprzężenia nadal są uwzględniane w wyniku kwerendy, nawet jeśli mają nie pasujące wyniki z kolekcji po prawej stronie.Kod można dodać do kwerendy, aby dostarczyć domyślną wartość wyniku, gdy brak pasujących wartości ze zbioru po prawej stronie sprzężenia.

Aby wykonać Left Outer Join przy użyciu klauzuli Join grupy

  • Dodaj następujący kod do Module1 moduł w projekcie, aby zobaczyć przykłady zarówno zgrupowane lewe sprzężenie zewnętrzne, jak i niegrupowanej lewe sprzężenie zewnętrzne.

    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
    

Wykonać sprzężenie przy użyciu klucza złożonego

Można użyć And słowa kluczowego w Join lub Group Join klauzuli do identyfikowania wielu pól klucza do użycia podczas dopasowywania wartości z kolekcji, że jest dołączony.And Słowa kluczowego określa wszystkie określone pola klucza muszą być zgodne dla elementów, które mają zostać połączone.

Aby przeprowadzić sprzężenie przy użyciu klucza złożonego

  • Dodaj następujący kod do Module1 moduł w projekcie, aby zobaczyć przykłady sprzężenia, który używa klucza złożonego.

    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
    

Uruchamianie kodu

Aby dodać kod, aby uruchomić przykłady

  1. Zastąpić Sub Main w Module1 moduł w projekcie z następujący kod do uruchomienia w przykładach w tym temacie.

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. Naciśnij klawisz F5, aby uruchomić przykłady.

Zobacz też

Informacje

Dołącz klauzulę (Visual Basic)

Klauzula sprzężenia grupy (Visual Basic)

Z klauzuli (Visual Basic)

Gdy klauzula (Visual Basic)

Koncepcje

Wprowadzenie do LINQ w języku Visual Basic

Przekształcenia danych z LINQ (C#)

Inne zasoby

LINQ w języku Visual Basic

Kwerendy (Visual Basic)