Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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).
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.
Jenis elemen dalam sumber data,
names
, adalah jenis variabel rentang,name
, dalam kueri.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.Kueri yang ditentukan di
mNames
dijalankan dalam perulanganFor Each
. Perulangan berulang atas hasil menjalankan kueri. KarenamNames
, 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.
Jenis elemen dalam sumber data,
customers
, adalah jenis variabel rentang,cust
, dalam kueri. Dalam contoh ini, jenis tersebut adalahCustomer
.Pernyataan
Select
mengembalikanName
properti dari setiapCustomer
objek alih-alih seluruh objek. KarenaName
adalah string, variabel kueri,custNames
, akan kembali menjadi IEnumerable(Of String), bukan dariCustomer
.Karena
custNames
mewakili urutan string, variabel iterasiFor 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.
Jenis elemen dalam sumber data adalah sekali lagi jenis dari variabel rentang dalam kueri. Dalam contoh ini,
cust
adalah instans dariCustomer
.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.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.