Cara: Menggabungkan Data dengan LINQ Menggunakan Gabungan (Visual Basic)
Visual Basic menyediakan klausul kueri Join
dan Group Join
untuk memungkinkan Anda menggabungkan konten beberapa kumpulan berdasarkan nilai umum antar kumpulan. Nilai-nilai ini dikenal sebagai nilai kunci. Pengembang yang terbiasa dengan konsep database hubungan akan mengenali klausul Join
sebagai INNER JOIN dan klausul Group Join
sebagai LEFT OUTER JOIN.
Contoh dalam topik ini menunjukkan beberapa cara untuk menggabungkan data menggunakan klausul kueri Join
dan Group Join
.
Membuat Project dan Menambahkan Data Sampel
Untuk membuat proyek yang berisi data dan jenis sampel
Untuk menjalankan sampel dalam topik ini, buka Visual Studio dan tambahkan proyek Aplikasi Konsol Visual Basic baru. Klik ganda file Module1.vb yang dibuat oleh Visual Basic.
Sampel dalam topik ini menggunakan jenis
Person
danPet
, serta data dari contoh kode berikut. Salin kode ini ke modulModule1
default yang dibuat oleh 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
Melakukan Gabungan Dalam dengan Menggunakan Klausul Gabungan
INNER JOIN menggabungkan data dari dua kumpulan. Item yang cocok dengan nilai kunci yang ditentukan akan disertakan. Item apa pun dari salah satu kumpulan yang tidak memiliki item yang cocok di kumpulan lain akan dikecualikan.
Dalam Visual Basic, LINQ menyediakan dua opsi untuk melakukan INNER JOIN: gabungan implisit dan gabungan eksplisit.
Gabungan implisit menentukan kumpulan yang akan digabungkan dalam klausul From
dan mengidentifikasi bidang kunci yang cocok dalam klausul Where
. Visual Basic bergabung dengan dua kumpulan secara implisit berdasarkan bidang kunci yang ditentukan.
Anda dapat menentukan gabungan eksplisit dengan menggunakan klausul Join
saat ingin tahu lebih spesifik bidang kunci mana yang akan digunakan dalam gabungan. Dalam hal ini, klausul Where
masih dapat digunakan untuk memfilter hasil kueri.
Untuk melakukan Gabungan Dalam dengan menggunakan klausul Gabungan
Tambahkan kode berikut ke modul
Module1
dalam proyek Anda untuk melihat contoh gabungan dalam implisit dan eksplisit.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
Lakukan Gabungan Kiri Luar dengan Menggunakan Klausul Gabungan Grup
LEFT OUTER JOIN mencakup semua item dari kumpulan sisi kiri gabungan dan hanya mencocokkan nilai dari kumpulan sisi kanan gabungan. Item apa pun dari kumpulan gabungan sisi kanan yang tidak memiliki item yang cocok di kumpulan sisi kiri akan dikecualikan dari hasil kueri.
Klausul Group Join
ini berfungsi sebagai LEFT OUTER JOIN. Perbedaan antara LEFT OUTER JOIN dan yang dimunculkan klausul Group Join
adalah klausul Group Join
mengelompokkan hasil dari kumpulan sisi kanan gabungan untuk setiap item di kumpulan sisi kiri. Dalam database hubungan, LEFT OUTER JOIN memunculkan hasil yang tidak dikelompokkan di mana setiap item dalam hasil kueri berisi item yang cocok dari kedua kumpulan dalam gabungan. Dalam hal ini, item dari kumpulan sisi kiri gabungan diulang pada setiap item yang cocok dari kumpulan sisi kanan. Anda akan melihat hasilnya ketika prosedur berikutnya selesai.
Anda bisa mengambil hasil kueri Group Join
sebagai hasil yang tidak dikelompokkan dengan memperluas kueri untuk memunculkan item pada setiap hasil kueri yang dikelompokkan. Untuk mencapai hal ini, Anda harus memastikan bahwa Anda mengkueri metode DefaultIfEmpty
pada kumpulan yang dikelompokkan. Hal ini memastikan bahwa item dari kumpulan sisi kiri gabungan masih disertakan dalam hasil kueri meskipun tidak memiliki hasil yang cocok dari kumpulan sisi kanan. Anda dapat menambahkan kode ke kueri untuk memberikan nilai hasil default saat tidak ada nilai yang cocok dari kumpulan gabungan di sisi kanan.
Untuk melakukan Gabungan Kiri Luar menggunakan klausul Gabungan Grup
Tambahkan kode berikut ke modul
Module1
di proyek Anda untuk melihat contoh gabungan kiri luar yang dikelompokkan dan gabungan kiri luar yang tidak dikelompokkan.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
Melakukan Gabungan Menggunakan Kunci Komposit
Anda dapat menggunakan kata kunci And
dalam klausul Join
atau Group Join
untuk mengidentifikasi beberapa bidang kunci yang akan digunakan saat mencocokkan nilai dari kumpulan yang digabungkan. Kata kunci And
menentukan bahwa semua bidang kunci yang ditentukan harus cocok dengan item yang akan digabungkan.
Untuk melakukan Gabungan dengan menggunakan kunci komposit
Tambahkan kode berikut ke modul
Module1
di proyek Anda untuk melihat contoh gabungan yang menggunakan kunci komposit.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
Menjalankan Kode
Untuk menambahkan kode guna menjalankan contoh
Ganti
Sub Main
dalam modulModule1
di proyek Anda dengan kode berikut untuk menjalankan contoh di topik ini.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Tekan F5 untuk menjalankan contoh.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk