Hubungan Jenis dalam Operasi Kueri LINQ (C#)
Untuk menulis kueri secara efektif, Anda harus memahami bagaimana jenis variabel dalam operasi kueri lengkap semuanya terkait satu sama lain. Jika Anda memahami hubungan ini, Anda akan lebih mudah memahami sampel LINQ dan contoh kode dalam dokumentasi. Selain itu, Anda akan memahami apa yang terjadi ketika variabel secara implisit di ketik dengan menggunakan var
.
Operasi kueri LINQ diketik dengan kuat dalam sumber data, dalam kueri itu sendiri, dan dalam eksekusi kueri. Jenis variabel dalam kueri harus kompatibel dengan jenis elemen di sumber data dan dengan jenis variabel iterasi dalam pernyataan foreach
. Pengetikan yang kuat ini menjamin bahwa kesalahan jenis ditangkap pada waktu kompilasi ketika mereka dapat diperbaiki sebelum pengguna menemukannya.
Untuk menunjukkan hubungan jenis ini, sebagian besar contoh berikut menggunakan pengetikan eksplisit untuk semua variabel. Contoh terakhir menunjukkan bagaimana prinsip yang sama berlaku bahkan ketika Anda menggunakan pengetikan implisit dengan menggunakan var
.
Kueri yang tidak Mengubah Data Sumber
Ilustrasi berikut menunjukkan operasi kueri LINQ ke Objek yang tidak melakukan transformasi pada data. Sumber berisi urutan string dan output kueri juga merupakan urutan string.
- Argumen jenis sumber data menentukan jenis variabel rentang.
- Jenis objek yang dipilih menentukan jenis variabel kueri.
name
berikut adalah string. Oleh karena itu, variabel kueri adalahIEnumerable<string>
. - Variabel kueri diulang dalam pernyataan
foreach
. Karena variabel kueri adalah urutan string, variabel iterasi juga merupakan string.
Kueri yang Mengubah Data Sumber
Ilustrasi berikut menunjukkan operasi kueri LINQ ke SQL yang melakukan transformasi sederhana pada data. Kueri mengambil urutan objek Customer
sebagai input, dan hanya memilih properti Name
dalam hasil. Karena Name
merupakan string, kueri menghasilkan urutan string sebagai output.
- Argumen jenis sumber data menentukan jenis variabel rentang.
- Pernyataan
select
mengembalikan propertiName
alih-alih objek lengkapCustomer
. KarenaName
adalah string, jenis argumencustNameQuery
adalahstring
, bukanCustomer
. - Karena
custNameQuery
merupakan urutan string, variabel iterasi perulanganforeach
juga harus berupastring
.
Ilustrasi berikut menunjukkan transformasi yang sedikit lebih kompleks. Pernyataan select
mengembalikan jenis anonim yang hanya menangkap dua anggota objek asli Customer
.
- Argumen jenis sumber data selalu merupakan jenis variabel rentang dalam kueri.
- Karena pernyataan
select
menghasilkan jenis anonim, variabel kueri harus diketik secara implisit dengan menggunakanvar
. - Karena jenis variabel kueri bersifat implisit, variabel iterasi dalam perulangan
foreach
juga harus implisit.
Membiarkan kompilator menyimpulkan informasi jenis
Meskipun Anda harus memahami hubungan jenis dalam operasi kueri, Anda memiliki opsi untuk membiarkan kompilator melakukan semua pekerjaan untuk Anda. Kata kunci var dapat digunakan untuk variabel lokal apa pun dalam operasi kueri. Ilustrasi berikut mirip dengan contoh nomor 2 yang dibahas sebelumnya. Namun, kompilator memasok jenis yang kuat untuk setiap variabel pada operasi kueri.
Jenis LINQ dan generik (C#)
Kueri LINQ didasarkan pada jenis generik. Anda tidak memerlukan pengetahuan mendalam tentang generik sebelum Anda dapat mulai menulis kueri. Namun, Anda mungkin ingin memahami dua konsep dasar:
- Saat Anda membuat instans kelas koleksi generik seperti List<T>, Anda mengganti "T" dengan jenis objek yang akan ditampung oleh daftar tersebut. Misalnya, daftar string dinyatakan sebagai
List<string>
, dan daftar objekCustomer
dinyatakan sebagaiList<Customer>
. Daftar generik yang dijeniskan dengan tepat dan memberikan banyak keuntungan atas koleksi yang menyimpan elemennya sebagai Object. Jika Anda mencoba menambahkanCustomer
keList<string>
, Anda akan mendapatkan kesalahan pada waktu kompilasi. Mudah untuk menggunakan koleksi generik karena Anda tidak perlu melakukan pengubahan jenis run-time. - IEnumerable<T> adalah antarmuka yang memungkinkan kelas koleksi generik dienumerasi menggunakan pernyataan
foreach
. Kelas koleksi generik mendukung IEnumerable<T> sama seperti kelas koleksi non-generik seperti ArrayList mendukung IEnumerable.
Untuk informasi selengkapnya tentang generik, lihat Generik.
Variabel IEnumerable<T> dalam kueri LINQ
Variabel kueri LINQ dijeniskan sebagai IEnumerable<T> atau jenis turunan seperti IQueryable<T>. Saat Anda melihat variabel kueri yang dijeniskan sebagai IEnumerable<Customer>
, itu berarti bahwa kueri, saat dijalankan, akan menghasilkan urutan nol atau lebih objek Customer
.
IEnumerable<Customer> customerQuery =
from cust in customers
where cust.City == "London"
select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}
Membiarkan kompilator menangani deklarasi jenis generik
Jika mau, Anda dapat menghindari sintaksis generik menggunakan kata kunci var. Kata kunci var
menginstruksikan pengompilasi untuk menyimpulkan jenis variabel kueri dengan melihat sumber data yang ditentukan dalam klausul from
. Contoh berikut menghasilkan kode terkompilasi yang sama dengan contoh sebelumnya:
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;
foreach(var customer in customerQuery2)
{
Console.WriteLine($"{customer.LastName}, {customer.FirstName}");
}
Kata kunci var
berguna ketika jenis variabel jelas atau ketika tidak terlalu penting untuk secara eksplisit menentukan jenis generik berlapis seperti yang dihasilkan oleh kueri grup. Secara umum, kami menyarankan jika Anda menggunakan var
, pahami bahwa itu dapat membuat kode Anda lebih sulit dibaca orang lain. Untuk informasi selengkapnya, lihat Variabel Lokal Berjenis Implisit.
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