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.

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. name berikut adalah string. Oleh karena itu, variabel kueri adalah IEnumerable<string>.
  3. 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.

Diagram memperlihatkan kueri yang mengubah tipe data.

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

Ilustrasi berikut menunjukkan transformasi yang sedikit lebih kompleks. Pernyataan select mengembalikan jenis anonim yang hanya menangkap dua anggota 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. Karena pernyataan select menghasilkan jenis anonim, variabel kueri harus diketik secara implisit dengan menggunakan var.
  3. 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.

Diagram yang memperlihatkan alur jenis dengan pengetikan implisit.

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:

  1. 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 objek Customer dinyatakan sebagai List<Customer>. Daftar generik yang dijeniskan dengan tepat dan memberikan banyak keuntungan atas koleksi yang menyimpan elemennya sebagai Object. Jika Anda mencoba menambahkan Customer ke List<string>, Anda akan mendapatkan kesalahan pada waktu kompilasi. Mudah untuk menggunakan koleksi generik karena Anda tidak perlu melakukan pengubahan jenis run-time.
  2. 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.