Bagikan melalui


Cara: Menggabungkan Data dengan LINQ dengan Menggunakan Gabungan (Visual Basic)

Visual Basic menyediakan Join klausa kueri dan Group Join untuk memungkinkan Anda menggabungkan konten beberapa koleksi berdasarkan nilai umum di antara koleksi. Nilai-nilai ini dikenal sebagai nilai kunci . Pengembang yang terbiasa dengan konsep database relasional akan mengenali Join klausul sebagai INNER JOIN dan Group Join klausul sebagai, secara efektif, LEFT OUTER JOIN.

Contoh dalam topik ini menunjukkan beberapa cara untuk menggabungkan data dengan menggunakan Join klausa kueri dan Group Join .

Membuat Proyek 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 Visual Basic Console baru. Klik dua kali file Module1.vb yang dibuat oleh Visual Basic.

  2. Sampel dalam topik ini menggunakan jenis Person dan data dari Pet dalam contoh kode berikut. Salin kode ini ke dalam modul default Module1 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 Inner Join dengan Menggunakan Klausa Join

INNER JOIN menggabungkan data dari dua kumpulan data. Item yang cocok dengan nilai kunci yang ditentukan disertakan. Item apa pun dari salah satu koleksi yang tidak memiliki item yang cocok di koleksi lain dikecualikan.

Di Visual Basic, LINQ menyediakan dua opsi untuk melakukan INNER JOIN: gabungan implisit dan gabungan eksplisit.

Gabungan implisit menentukan koleksi yang akan digabungkan dalam klausul From dan mengidentifikasi bidang kunci yang cocok dalam klausa Where. Visual Basic secara implisit menggabungkan dua koleksi berdasarkan bidang kunci yang ditentukan.

Anda dapat menentukan gabungan eksplisit dengan menggunakan Join klausa saat Anda ingin spesifik tentang bidang kunci mana yang akan digunakan dalam gabungan. Dalam hal ini, Where klausa masih dapat digunakan untuk memfilter hasil kueri.

Untuk melakukan Inner Join dengan menggunakan klausa JOIN

  1. Tambahkan kode berikut ke modul Module1 dalam proyek Anda untuk melihat contoh inner join 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
    

Melakukan Gabungan Luar Kiri dengan Menggunakan Klausul Gabungan Grup

LEFT OUTER JOIN menyertakan semua elemen dari koleksi sisi kiri join dan hanya nilai yang cocok dari koleksi sisi kanan join. Item apa pun dari kumpulan sisi kanan gabungan yang tidak memiliki item yang cocok di koleksi sisi kiri dikecualikan dari hasil kueri.

Klausa Group Join pada dasarnya melakukan LEFT OUTER JOIN. Perbedaan antara apa yang biasanya dikenal sebagai LEFT OUTER JOIN dan apa yang dikembalikan oleh klausul Group Join adalah bahwa klausul Group Join mengelompokkan hasil dari kumpulan sisi kanan join untuk setiap item di kumpulan sisi kiri. Dalam database relasional, LEFT OUTER JOIN mengembalikan hasil yang tidak dikelompokkan di mana setiap item dalam hasil kueri berisi item yang cocok dari kedua kumpulan. Dalam hal ini, item dari koleksi sisi kiri gabungan diulang untuk setiap item yang cocok dari kumpulan sisi kanan. Anda akan melihat seperti apa tampilan ini ketika Anda menyelesaikan prosedur berikutnya.

Anda bisa mengambil hasil Group Join kueri sebagai hasil yang tidak dikelompokkan dengan memperluas kueri Anda agar dapat mengembalikan item untuk setiap hasil kueri yang dikelompokkan. Untuk mencapai hal ini, Anda harus memastikan bahwa Anda melakukan kueri pada metode DefaultIfEmpty dari koleksi yang dikelompokkan. Ini memastikan bahwa item dari koleksi sisi kiri penggabungan masih disertakan dalam hasil kueri bahkan jika mereka tidak memiliki hasil yang cocok dari koleksi sisi kanan. Anda dapat menambahkan kode ke kueri Anda untuk memberikan nilai hasil default saat tidak ada nilai yang cocok dari kumpulan gabungan sisi kanan.

Untuk melakukan Left Outer Join dengan menggunakan klausa Group Join

  1. Tambahkan kode berikut ke Module1 modul di proyek Anda untuk melihat contoh gabungan luar kiri yang dikelompokkan dan gabungan luar kiri 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 dengan Menggunakan Kunci Komposit

Anda dapat menggunakan And kata kunci dalam Join klausa atau Group Join untuk mengidentifikasi beberapa bidang kunci yang akan digunakan saat mencocokkan nilai dari koleksi yang digabungkan. Kata And kunci menentukan bahwa semua bidang kunci yang ditentukan harus cocok untuk item yang akan digabungkan.

Untuk melakukan Join menggunakan kunci komposit

  1. Tambahkan kode berikut ke Module1 modul 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
    

Jalankan Kode

Untuk menambahkan kode untuk menjalankan contoh

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

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

Lihat juga