Porady: łączenie danych w LINQ za pomocą sprzężeń (Visual Basic)
Język Visual Basic udostępnia Join
klauzule i Group Join
zapytania, aby umożliwić łączenie zawartości wielu kolekcji na podstawie wspólnych wartości między kolekcjami. Te wartości są nazywane wartościami klucza . Deweloperzy zaznajomieni z pojęciami relacyjnej bazy danych rozpoznają Join
klauzulę JAKO SPRZĘŻENIE WEWNĘTRZNE i Group Join
klauzulę jako, skutecznie, LEWE SPRZĘŻENIE ZEWNĘTRZNE.
W przykładach w tym temacie przedstawiono kilka sposobów łączenia danych przy użyciu Join
klauzul i Group Join
zapytania.
Tworzenie projektu i dodawanie przykładowych danych
Aby utworzyć projekt zawierający przykładowe dane i typy
Aby uruchomić przykłady w tym temacie, otwórz program Visual Studio i dodaj nowy projekt aplikacji konsolowej Visual Basic. Kliknij dwukrotnie plik Module1.vb utworzony przez visual basic.
Przykłady w tym temacie używają
Person
typów iPet
i danych z poniższego przykładu kodu. Skopiuj ten kod do domyślnegoModule1
modułu utworzonego przez 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
Wykonywanie sprzężenia wewnętrznego przy użyciu klauzuli Join
SPRZĘŻENIE WEWNĘTRZNE łączy dane z dwóch kolekcji. Elementy, dla których są uwzględniane określone wartości klucza. Wszystkie elementy z dowolnej kolekcji, które nie mają pasującego elementu w innej kolekcji, są wykluczone.
W języku Visual Basic LINQ oferuje dwie opcje wykonywania sprzężenia wewnętrznego: niejawnego sprzężenia i jawnego sprzężenia.
Sprzężenie niejawne określa kolekcje do sprzężenia w klauzuli From
i identyfikuje pasujące pola klucza w klauzuli Where
. Program Visual Basic niejawnie łączy dwie kolekcje na podstawie określonych pól klucza.
Możesz określić jawne sprzężenie przy użyciu klauzuli Join
, jeśli chcesz określić, które pola klucza mają być używane w sprzężeniu. W takim przypadku klauzula Where
może być nadal używana do filtrowania wyników zapytania.
Aby wykonać sprzężenie wewnętrzne przy użyciu klauzuli Join
Dodaj następujący kod do modułu
Module1
w projekcie, aby zobaczyć przykłady zarówno niejawnego, jak i jawnego sprzężenia wewnętrznego.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
Wykonywanie sprzężenia zewnętrznego po lewej stronie przy użyciu klauzuli dołączania grupy
LEWE SPRZĘŻENIA ZEWNĘTRZNE zawiera wszystkie elementy z kolekcji po lewej stronie sprzężenia i tylko pasujące wartości z kolekcji po prawej stronie 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 zapytania.
Klauzula Group Join
wykonuje, w efekcie, LEWE SPRZĘŻENIA ZEWNĘTRZNE. Różnica między tym, co jest zwykle znane jako LEFT OUTER JOIN i co Group Join
zwraca klauzula, jest to, że Group Join
klauzula grupuje wyniki z prawej kolekcji sprzężenia dla każdego elementu w kolekcji po lewej stronie. W relacyjnej bazie danych funkcja LEFT OUTER JOIN zwraca niezgrupowany wynik, w którym każdy element w wyniku zapytania zawiera pasujące elementy z obu kolekcji w sprzężeniu. W takim przypadku elementy z lewej kolekcji sprzężenia są powtarzane dla każdego pasującego elementu z kolekcji po prawej stronie. Zobaczysz, jak wygląda to po zakończeniu następnej procedury.
Wyniki Group Join
zapytania można pobrać jako niezgrupowany wynik, rozszerzając zapytanie w celu zwrócenia elementu dla każdego pogrupowanego wyniku zapytania. Aby to osiągnąć, należy upewnić się, że wykonujesz zapytanie względem DefaultIfEmpty
metody pogrupowanej kolekcji. Dzięki temu elementy z lewej kolekcji sprzężenia są nadal uwzględniane w wyniku zapytania, nawet jeśli nie mają pasujących wyników z kolekcji po prawej stronie. Możesz dodać kod do zapytania, aby podać domyślną wartość wyniku, gdy nie ma pasującej wartości z kolekcji sprzężenia po prawej stronie.
Aby wykonać lewe sprzężenie zewnętrzne przy użyciu klauzuli Group Join
Dodaj następujący kod do modułu
Module1
w projekcie, aby wyświetlić przykłady zarówno zgrupowanego lewego sprzężenia zewnętrznego, jak i niezgrupowanego lewego sprzężenia zewnętrznego.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
Wykonywanie sprzężenia przy użyciu klucza złożonego
Słowo kluczowe w klauzuli Join
or Group Join
służy And
do identyfikowania wielu pól kluczy do użycia podczas dopasowywania wartości ze sprzężonych kolekcji. Słowo And
kluczowe określa, że wszystkie określone pola klucza muszą być zgodne z elementami, które mają zostać połączone.
Aby wykonać sprzężenie przy użyciu klucza złożonego
Dodaj następujący kod do modułu
Module1
w projekcie, aby zobaczyć przykłady sprzężenia korzystającego z 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 do uruchamiania przykładów
Zastąp element
Sub Main
wModule1
module w projekcie następującym kodem, aby uruchomić przykłady w tym temacie.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Naciśnij klawisz F5, aby uruchomić przykłady.