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
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.
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
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
Naciśnij klawisz F5, aby uruchomić przykłady.
Zobacz też
Informacje
Dołącz klauzulę (Visual Basic)
Klauzula sprzężenia grupy (Visual Basic)
Koncepcje
Wprowadzenie do LINQ w języku Visual Basic
Przekształcenia danych z LINQ (C#)