Bagikan melalui


Kueri Terintegrasi Bahasa (LINQ)

Language-Integrated Query (LINQ) adalah nama untuk serangkaian teknologi berdasarkan integrasi kemampuan kueri langsung ke dalam bahasa C#. Secara tradisional, kueri terhadap data dinyatakan sebagai string sederhana tanpa memeriksa jenis pada waktu kompilasi atau dukungan IntelliSense. Selain itu, Anda harus mempelajari bahasa kueri yang berbeda untuk setiap jenis sumber data: database SQL, dokumen XML, berbagai layanan Web, dan sebagainya. Dengan LINQ, kueri adalah konstruksi bahasa kelas satu, sama seperti kelas, metode, dan peristiwa.

Saat Anda menulis kueri, bagian "terintegrasi bahasa" yang paling terlihat dari LINQ adalah ekspresi kueri. Ekspresi kueri ditulis dalam sintaks kueri deklaratif. Dengan menggunakan sintaks kueri, Anda melakukan operasi pemfilteran, pemesanan, dan pengelompokan pada sumber data dengan minimal kode. Anda menggunakan pola ekspresi kueri yang sama untuk mengkueri dan mengubah data dari semua jenis sumber data.

Contoh berikut menunjukkan operasi kueri lengkap. Operasi lengkap mencakup pembuatan sumber data, menentukan ekspresi kueri, dan menjalankan kueri dalam foreach pernyataan.

// Specify the data source.
int[] scores = [97, 92, 81, 60];

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (var i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

Anda mungkin perlu menambahkan direktif using , using System.Linq;, agar contoh sebelumnya dapat dikompilasi. Versi terbaru .NET menggunakan penggunaan implisit untuk menambahkan arahan ini sebagai penggunaan global. Versi lama mengharuskan Anda untuk menambahkannya di sumber Anda.

Gambaran umum ekspresi pencarian

  • Ekspresi kueri mengkueri dan mengubah data dari sumber data dengan dukungan LINQ apa pun. Misalnya, satu kueri dapat mengambil data dari database SQL dan menghasilkan aliran XML sebagai output.
  • Ekspresi kueri menggunakan banyak konstruksi bahasa C# yang akrab, yang membuatnya mudah dibaca.
  • Variabel dalam ekspresi kueri semuanya ditik dengan kuat.
  • Kueri tidak dijalankan sampai Anda melakukan iterasi atas variabel kueri, misalnya dalam foreach pernyataan.
  • Pada waktu kompilasi, ekspresi kueri dikonversi ke panggilan metode operator kueri standar sesuai dengan aturan yang ditentukan dalam spesifikasi C#. Kueri apa pun yang dapat diekspresikan dengan menggunakan sintaks kueri juga dapat diekspresikan dengan menggunakan sintaks metode. Dalam beberapa kasus, sintaks kueri lebih mudah dibaca dan ringkas. Di lain, sintaks metode lebih mudah dibaca. Tidak ada perbedaan semantik atau performa antara dua bentuk yang berbeda. Untuk informasi selengkapnya, lihat Spesifikasi bahasa C# dan Gambaran umum operator kueri Standar.
  • Beberapa operasi kueri, seperti Count atau Max, tidak memiliki klausa ekspresi kueri yang setara dan oleh karena itu harus dinyatakan sebagai panggilan metode. Sintaks metode dapat dikombinasikan dengan sintaks kueri dengan berbagai cara.
  • Ekspresi kueri dapat dikompilasi ke pohon ekspresi atau untuk mendelegasikan, bergantung pada jenis kueri yang diterapkan. IEnumerable<T> kueri dikompilasi ke delegasi. IQueryable dan IQueryable<T> kueri dikompilasi ke pohon ekspresi. Untuk informasi selengkapnya, lihat Pohon ekspresi.

Cara mengaktifkan kueri LINQ dari sumber data Anda

Data dalam memori

Ada dua cara Anda mengaktifkan kueri LINQ dari data dalam memori. Jika data adalah jenis yang mengimplementasikan IEnumerable<T>, Anda mengkueri data dengan menggunakan LINQ ke Objek. Jika tidak masuk akal untuk mengaktifkan enumerasi dengan menerapkan antarmuka, Anda menentukan metode operator kueri standar LINQ, baik dalam jenis tersebut atau sebagai IEnumerable<T> untuk jenis tersebut. Implementasi kustom operator kueri standar harus menggunakan eksekusi yang ditangguhkan untuk mengembalikan hasilnya.

Data tersimpan di jaringan

Opsi terbaik untuk mengaktifkan kueri LINQ dari sumber data jarak jauh adalah mengimplementasikan IQueryable<T> antarmuka.

Penyedia LINQ IQueryable

Penyedia LINQ yang menerapkan IQueryable<T> dapat sangat bervariasi dalam kompleksitasnya.

Penyedia yang lebih sederhana IQueryable mungkin mengakses satu metode dari layanan web. Jenis penyedia ini sangat spesifik karena mengharapkan informasi khusus dalam kueri yang ditanganinya. Sistem tipe tertutup ini mungkin menunjukkan satu jenis hasil. Sebagian besar eksekusi kueri terjadi secara lokal, misalnya dengan menggunakan Enumerable implementasi operator kueri standar. Penyedia yang kurang kompleks mungkin hanya memeriksa satu ekspresi panggilan metode di pohon ekspresi yang mewakili kueri, dan membiarkan logika kueri yang tersisa ditangani di tempat lain.

Penyedia dengan kompleksitas menengah mungkin dapat menargetkan sumber data yang memiliki bahasa permintaan yang hanya sebagian ekspresif. Jika layanan menargetkan layanan Web, layanan tersebut mungkin dapat mengakses lebih dari satu metode dari layanan Web dan menentukan metode mana yang akan dipanggil berdasarkan informasi yang dicari oleh kueri. Penyedia kompleksitas sedang akan memiliki sistem tipe yang lebih kaya daripada penyedia sederhana, tetapi akan tetap menjadi sistem tipe tetap. Misalnya, penyedia mungkin mengekspos jenis yang memiliki hubungan satu-ke-banyak yang dapat dilalui, tetapi tidak akan menyediakan teknologi pemetaan untuk jenis yang ditentukan pengguna.

Penyedia kompleks IQueryable , seperti penyedia Entity Framework Core , dapat menerjemahkan kueri LINQ lengkap ke bahasa kueri ekspresif, seperti SQL. Penyedia kompleks lebih umum karena dapat menangani berbagai pertanyaan yang lebih luas dalam kueri. Ini juga memiliki sistem jenis terbuka dan oleh karena itu harus berisi infrastruktur yang luas untuk memetakan jenis yang ditentukan pengguna. Mengembangkan penyedia yang kompleks membutuhkan sejumlah besar upaya.