Bagikan melalui


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

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

  2. Sampel dalam topik ini menggunakan jenis Person dan Pet, serta data dari contoh kode berikut. Salin kode ini ke modul Module1 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

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

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

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

  1. Ganti Sub Main dalam modul Module1 di proyek Anda dengan kode berikut untuk menjalankan contoh di topik ini.

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. Tekan F5 untuk menjalankan contoh.

Lihat juga