Bagikan melalui


Tipe Hubungan dalam Operasi Kueri (Visual Basic)

Variabel yang digunakan dalam operasi kueri Language-Integrated Query (LINQ) diketik dengan kuat dan harus kompatibel satu sama lain. Pengetikan yang kuat digunakan dalam sumber data, dalam kueri itu sendiri, dan dalam eksekusi kueri. Ilustrasi berikut mengidentifikasi istilah yang digunakan untuk menjelaskan kueri LINQ. Untuk informasi selengkapnya tentang bagian kueri, lihat Operasi Kueri Dasar (Visual Basic).

Cuplikan layar memperlihatkan kueri pseudocode dengan elemen disorot.

Jenis variabel rentang dalam kueri harus kompatibel dengan jenis elemen di sumber data. Jenis variabel kueri harus kompatibel dengan elemen urutan yang ditentukan dalam Select klausa. Terakhir, jenis elemen urutan juga harus kompatibel dengan jenis variabel kontrol perulangan yang digunakan dalam For Each pernyataan yang menjalankan kueri. Pengetikan yang kuat ini memfasilitasi identifikasi kesalahan jenis pada waktu kompilasi.

Visual Basic memudahkan penggunaan pengetikan kuat dengan menerapkan inferensi tipe lokal, juga dikenal sebagai pengetikan implisit. Fitur tersebut digunakan dalam contoh sebelumnya, dan Anda akan melihatnya digunakan di seluruh sampel dan dokumentasi LINQ. Di Visual Basic, penyimpulan jenis lokal dapat dilakukan dengan menggunakan pernyataan Dim tanpa klausa As. Dalam contoh berikut, city digolongkan sebagai string.

Dim city = "Seattle"

Nota

Inferensi jenis lokal hanya berfungsi ketika Option Infer diatur ke On. Untuk informasi selengkapnya, lihat Pernyataan Infer Opsi.

Namun, bahkan jika Anda menggunakan inferensi jenis lokal dalam kueri, hubungan jenis yang sama ada di antara variabel dalam sumber data, variabel kueri, dan perulangan eksekusi kueri. Berguna untuk memiliki pemahaman dasar tentang hubungan jenis ini ketika Anda menulis kueri LINQ, atau bekerja dengan sampel dan contoh kode dalam dokumentasi.

Anda mungkin perlu menentukan jenis eksplisit untuk variabel rentang yang tidak cocok dengan jenis yang dikembalikan dari sumber data. Anda dapat menentukan jenis variabel rentang dengan menggunakan As klausa. Namun, ini menghasilkan kesalahan jika konversi adalah konversi yang mempersempit dan Option Strict diatur ke On. Oleh karena itu, kami sarankan Anda melakukan konversi pada nilai yang diambil dari sumber data. Anda dapat mengonversi nilai dari sumber data ke jenis variabel rentang eksplisit dengan menggunakan Cast metode . Anda juga dapat melemparkan nilai yang dipilih dalam Select klausul ke jenis eksplisit yang berbeda dari jenis variabel rentang. Poin-poin ini diilustrasikan dalam kode berikut.

Dim numbers1() As Integer = {1, 2, 4, 16, 32, 64}
Dim numbers2() As Double = {5.0#, 10.0#, 15.0#}

' This code does not result in an error.
Dim numberQuery1 = From n As Integer In numbers1 Where n > 5

' This code results in an error with Option Strict set to On. The type Double
' cannot be implicitly cast as type Integer.
Dim numberQuery2 = From n As Integer In numbers2 Where n > 5

' This code casts the values in the data source to type Integer. The type of
' the range variable is Integer.
Dim numberQuery3 = From n In numbers2.Cast(Of Integer)() Where n > 5

' This code returns the value of the range variable converted to Integer. The type of
' the range variable is Double.
Dim numberQuery4 = From n In numbers2 Where n > 5 Select CInt(n)

Kueri yang Mengembalikan Seluruh Elemen Data Sumber

Contoh berikut menunjukkan operasi kueri LINQ yang mengembalikan urutan elemen yang dipilih dari data sumber. Sumber, names, berisi array string, dan output kueri adalah urutan yang berisi string yang dimulai dengan huruf M.

Dim names = {"John", "Rick", "Maggie", "Mary"}
Dim mNames = From name In names
             Where name.IndexOf("M") = 0
             Select name

For Each nm In mNames
    Console.WriteLine(nm)
Next

Ini setara dengan kode berikut, tetapi jauh lebih pendek dan lebih mudah ditulis. Mengandalkan inferensi jenis lokal dalam kueri adalah gaya yang disukai di Visual Basic.

Dim names2 = {"John", "Rick", "Maggie", "Mary"}
Dim mNames2 As IEnumerable(Of String) =
    From name As String In names
    Where name.IndexOf("M") = 0
    Select name

For Each nm As String In mNames
    Console.WriteLine(nm)
Next

Hubungan berikut ada di kedua contoh kode sebelumnya, apakah jenis ditentukan secara implisit atau eksplisit.

  1. Jenis elemen dalam sumber data, names, adalah jenis variabel rentang, name, dalam kueri.

  2. Jenis objek yang dipilih, name, menentukan jenis variabel kueri, mNames. Berikut ini, name adalah string, jadi variabel kueri adalah IEnumerable(Of String) di Visual Basic.

  3. Kueri yang ditentukan di mNames dijalankan dalam perulangan For Each . Perulangan berulang atas hasil menjalankan kueri. Karena mNames, ketika dijalankan, akan mengembalikan urutan string, variabel iterasi perulangan, nm, juga merupakan string.

Kueri yang Mengembalikan Satu Bidang dari Elemen Terpilih

Contoh berikut menunjukkan operasi kueri LINQ ke SQL yang mengembalikan urutan yang hanya berisi satu bagian dari setiap elemen yang dipilih dari sumber data. Kueri mengambil kumpulan Customer objek sebagai sumber datanya dan hanya memproyeksikan Name properti dalam hasilnya. Karena nama pelanggan adalah string, kueri menghasilkan urutan string sebagai output.

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim custNames = From cust In customers
                Where cust.City = "London"
                Select cust.Name

For Each custName In custNames
    Console.WriteLine(custName)
Next

Hubungan antara variabel seperti yang ada dalam contoh yang lebih sederhana.

  1. Jenis elemen dalam sumber data, customers, adalah jenis variabel rentang, cust, dalam kueri. Dalam contoh ini, jenis tersebut adalah Customer.

  2. Pernyataan Select mengembalikan Name properti dari setiap Customer objek alih-alih seluruh objek. Karena Name adalah string, variabel kueri, custNames, akan kembali menjadi IEnumerable(Of String), bukan dari Customer.

  3. Karena custNames mewakili urutan string, variabel iterasi For Each perulangan, custName, harus berupa string.

Tanpa inferensi jenis lokal, contoh sebelumnya akan lebih rumit untuk ditulis dan dipahami, seperti yang ditunjukkan contoh berikut.

' Method GetTable returns a table of Customer objects.
 Dim customers As Table(Of Customer) = db.GetTable(Of Customer)()
 Dim custNames As IEnumerable(Of String) =
     From cust As Customer In customers
     Where cust.City = "London"
     Select cust.Name

 For Each custName As String In custNames
     Console.WriteLine(custName)
 Next

Kueri yang Memerlukan Tipe Anonim

Contoh berikut menunjukkan situasi yang lebih kompleks. Dalam contoh sebelumnya, tidak nyaman untuk menentukan jenis untuk semua variabel secara eksplisit. Dalam contoh ini, tidak mungkin. Alih-alih memilih seluruh Customer elemen dari sumber data, atau satu bidang dari setiap elemen, Select klausa dalam kueri ini mengembalikan dua properti objek asli Customer : Name dan City. Sebagai respons terhadap Select klausa, pengompilasi mendefinisikan jenis anonim yang berisi dua properti tersebut. Hasil eksekusi nameCityQuery dalam perulangan For Each adalah kumpulan instans dari jenis anonim baru. Karena jenis anonim tidak memiliki nama yang dapat digunakan, Anda tidak dapat menentukan jenis nameCityQuery atau custInfo secara eksplisit. Artinya, dengan jenis anonim, Anda tidak memiliki nama jenis untuk digunakan sebagai pengganti String di IEnumerable(Of String). Untuk informasi selengkapnya, lihat Jenis Anonim.

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim nameCityQuery = From cust In customers
                    Where cust.City = "London"
                    Select cust.Name, cust.City

For Each custInfo In nameCityQuery
    Console.WriteLine(custInfo.Name)
Next

Meskipun tidak dimungkinkan untuk menentukan jenis untuk semua variabel dalam contoh sebelumnya, hubungan tetap sama.

  1. Jenis elemen dalam sumber data adalah sekali lagi jenis dari variabel rentang dalam kueri. Dalam contoh ini, cust adalah instans dari Customer.

  2. Select Karena pernyataan menghasilkan jenis anonim, variabel kueri, nameCityQuery, harus ditik secara implisit sebagai jenis anonim. Jenis anonim tidak memiliki nama yang dapat digunakan, dan oleh karena itu tidak dapat ditentukan secara eksplisit.

  3. Jenis variabel iterasi dalam perulangan For Each adalah jenis anonim yang dibuat di langkah 2. Karena jenis tidak memiliki nama yang dapat digunakan, jenis variabel iterasi perulangan harus ditentukan secara implisit.

Lihat juga