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.
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. Anda menulis ekspresi kueri 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 memeriksa 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
foreachpernyataan. - Pada waktu kompilasi, pengkompilasi mengonversi ekspresi kueri ke panggilan metode operator kueri standar sesuai dengan aturan yang ditentukan dalam spesifikasi C#. Anda dapat mengekspresikan kueri apa pun yang menggunakan sintaks kueri 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 harus dinyatakan sebagai panggilan metode. Anda dapat menggabungkan sintaks metode dengan sintaks kueri dengan berbagai cara.
- Ekspresi kueri dapat dikompilasi ke pohon ekspresi atau untuk mendelegasikan, bergantung pada jenis kueri yang diterapkan. Pengkompilasi mengkompilasi kueri IEnumerable<T> ke dalam delegate. Kompilator mengkompilasi IQueryable dan IQueryable<T> kueri menjadi pohon ekspresi. Untuk informasi selengkapnya, lihat Pohon ekspresi.
Cara mengaktifkan kueri LINQ dari sumber data Anda
Data dalam memori
Anda dapat mengaktifkan kueri LINQ data dalam memori dengan dua cara. Jika data adalah jenis yang mengimplementasikan IEnumerable<T>, kueri data dengan menggunakan LINQ ke Objek. Jika tidak masuk akal untuk mengaktifkan enumerasi dengan menerapkan antarmuka, tentukan 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 khusus untuk sumber data karena mengharapkan informasi tertentu 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 dengan kompleksitas sedang memiliki sistem tipe yang lebih kaya daripada penyedia sederhana, tetapi tetap merupakan sistem tipe yang tetap. Misalnya, penyedia mungkin mengekspos jenis yang memiliki hubungan satu-ke-banyak yang dapat dilalui, tetapi tidak menyediakan teknologi pemetaan untuk jenis yang didefinisikan oleh 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.