Bagikan melalui


Ketik Hubungan dalam Operasi Kueri LINQ (C#)

Untuk menulis kueri secara efektif, Anda harus memahami bagaimana jenis variabel dalam operasi kueri lengkap semuanya berhubungan 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 secara ketat pada 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 foreach pernyataan. Pengetikan bertipe yang kuat ini menjamin bahwa kesalahan tipe ditemukan saat dikompilasi, sehingga dapat diperbaiki sebelum mencapai pengguna.

Untuk menunjukkan hubungan jenis ini, sebagian besar contoh yang mengikuti 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.

Diagram yang memperlihatkan hubungan tipe data dalam kueri LINQ.

  1. Argumen jenis sumber data menentukan jenis variabel rentang.
  2. Jenis objek yang dipilih menentukan jenis variabel kueri. Berikut name adalah string. Oleh karena itu, variabel kueri adalah IEnumerable<string>.
  3. Variabel kueri diulang dalam foreach pernyataan. 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.

Diagram memperlihatkan kueri yang mengubah tipe data.

  1. Argumen jenis sumber data menentukan jenis variabel rentang.
  2. Pernyataan select mengembalikan Name properti alih-alih objek lengkap Customer . Karena Name adalah string, argumen jenis custNameQuery adalah string, bukan Customer.
  3. Karena custNameQuery merupakan urutan string, variabel iterasi foreach perulangan juga harus berupa string.

Ilustrasi berikut menunjukkan transformasi yang sedikit lebih kompleks. Pernyataan select mengembalikan jenis anonim yang memuat hanya dua anggota dari objek asli Customer.

Diagram memperlihatkan kueri yang lebih kompleks yang mengubah tipe data.

  1. Argumen jenis sumber data selalu merupakan jenis variabel rentang dalam kueri.
  2. select Karena pernyataan menghasilkan jenis anonim, variabel kueri harus ditik secara implisit dengan menggunakan var.
  3. Karena jenis variabel kueri 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 pengkompilasi 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, pengkompilasi menyediakan jenis yang kuat untuk setiap variabel dalam operasi kueri.

Diagram yang menunjukkan alur tipe dengan penyusunan implisit.

LINQ dan jenis 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:

  1. Saat Anda membuat instans kelas koleksi generik seperti List<T>, Anda mengganti "T" dengan jenis objek yang akan disimpan dalam daftar. Misalnya, daftar string dinyatakan sebagai List<string>, dan daftar Customer objek dinyatakan sebagai List<Customer>. Daftar generik diketik secara tegas dan memberikan banyak manfaat dibandingkan koleksi yang menyimpan elemennya sebagai Object. Jika Anda mencoba menambahkan Customer ke List<string>, Anda akan mendapatkan kesalahan pada waktu kompilasi. Sangat mudah untuk menggunakan koleksi generik karena Anda tidak perlu melakukan pemeriksaan tipe runtime.
  2. IEnumerable<T> adalah antarmuka yang memungkinkan kelas pengumpulan generik dijumlahkan dengan menggunakan foreach pernyataan . Kelas koleksi generik mendukung IEnumerable<T> sama seperti kelas koleksi non-generik mendukung ArrayList.

Untuk informasi selengkapnya tentang generik, lihat Generik.

Variabel IEnumerable<T> dalam kueri LINQ

Variabel kueri LINQ diketik sebagai IEnumerable<T> atau jenis turunan seperti IQueryable<T>. Ketika Anda melihat variabel kueri yang di ketik sebagai IEnumerable<Customer>, itu hanya berarti bahwa kueri, ketika dijalankan, akan menghasilkan urutan nol atau lebih Customer objek.

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 sintaks generik dengan menggunakan kata kunci var . Kata var kunci menginstruksikan pengkompilasi untuk menyimpulkan jenis variabel kueri dengan melihat sumber data yang ditentukan dalam from klausa. Contoh berikut menghasilkan kode yang dikompilasi 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 var kunci 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 agar jika Anda menggunakan var, menyadari bahwa itu dapat membuat kode Anda lebih sulit dibaca orang lain. Untuk informasi selengkapnya, lihat Variabel Lokal Berjenis Implisit.