Pengantar Kueri LINQ (C#)
Kueri adalah ekspresi yang mengambil data dari sumber data. Kueri biasanya dinyatakan dalam bahasa komputer kueri khusus. Bahasa komputer yang berbeda telah dikembangkan dari waktu ke waktu untuk berbagai jenis sumber data, misalnya SQL untuk database hubungan dan XQuery untuk XML. Oleh karena itu, pengembang diminta untuk mempelajari bahasa komputer kueri baru untuk setiap jenis sumber data atau format data yang harus mereka dukung. LINQ menyederhanakan situasi ini dengan menawarkan model yang konsisten untuk bekerja dengan data di berbagai jenis sumber dan format data. Dalam kueri LINQ, Anda selalu bekerja dengan objek. Anda menggunakan pola pengodean dasar yang sama untuk kueri dan mengubah data dalam dokumen XML, SQL database, Himpunan data ADO.NET, koleksi .NET, dan format lain yang tersedia untuk penyedia LINQ.
Tiga Bagian Dari Operasi Kueri
Semua operasi kueri LINQ terdiri dari tiga tindakan berbeda:
Dapatkan sumber data.
Buat kueri.
Mengeksekusi kueri.
Contoh berikut menunjukkan bagaimana tiga bagian operasi kueri dinyatakan dalam kode sumber. Contoh ini menggunakan array bilangan bulat sebagai sumber data untuk kenyamanan; namun, konsep yang sama juga berlaku untuk sumber data lain. Contoh ini dirujuk ke seluruh topik ini.
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
Ilustrasi berikut menunjukkan operasi kueri lengkap. Di LINQ, eksekusi kueri berbeda dari kueri itu sendiri. Dengan kata lain, Anda belum mengambil data apa pun hanya dengan membuat variabel kueri.

Sumber Data
Dalam contoh sebelumnya, karena sumber datanya adalah array, secara implisit mendukung antarmuka generik IEnumerable<T>. Fakta ini berarti dapat dikueri dengan LINQ. Kueri dijalankan dalam pernyataan foreach, dan foreach memerlukan IEnumerable atau IEnumerable<T>. Jenis yang mendukung IEnumerable<T> atau antarmuka turunan seperti generik IQueryable<T> disebut jenis yang dapat dikueri.
Jenis yang dapat dikueri tidak memerlukan modifikasi atau perlakuan khusus untuk berfungsi sebagai sumber data LINQ. Jika data sumber belum ada dalam memori sebagai jenis yang dapat dikueri, penyedia LINQ harus menyatakannya seperti itu. Misalnya, LINQ ke XML memuat dokumen XML ke dalam jenis XElement yang dapat dikueri:
// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
Dengan LINQ to SQL, Anda terlebih dahulu membuat pemetaan relasional objek pada waktu desain baik secara manual atau dengan menggunakan LINQ to SQL Tools di Visual Studio. Anda menulis kueri Anda terhadap objek, dan pada run-time LINQ to SQL menangani komunikasi dengan database. Dalam contoh berikut, Customers mewakili tabel tertentu dalam database, dan jenis hasil kueri, IQueryable<T>, berasal dari IEnumerable<T>.
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Query for customers in London.
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
Untuk informasi selengkapnya tentang cara membuat jenis sumber data tertentu, lihat dokumentasi untuk berbagai penyedia LINQ. Namun, aturan dasarnya sangat sederhana: sumber data LINQ adalah objek apa pun yang mendukung antarmuka IEnumerable<T> generik, atau antarmuka yang mewarisinya.
Catatan
Jenis seperti ArrayList yang mendukung antarmuka non-generik IEnumerable juga dapat digunakan sebagai sumber data LINQ. Untuk informasi selengkapnya, lihat Cara kueri ArrayList dengan LINQ.
Kueri
Kueri menentukan informasi apa yang akan diambil dari sumber data atau sumber. Secara opsional, kueri juga menentukan bagaimana informasi tersebut harus diurutkan, dikelompokkan, dan dibentuk sebelum dikembalikan. Kueri disimpan dalam variabel kueri dan diinisialisasi dengan ekspresi kueri. Untuk mempermudah penulisan kueri, C# telah memperkenalkan sintaks kueri baru.
Kueri dalam contoh sebelumnya mengembalikan semua bilangan genap dari array bilangan bulat. Ekspresi kueri berisi tiga klausa: from, where dan select. (Jika Anda terbiasa dengan SQL, Anda akan melihat bahwa urutan klausanya adalah kebalikan dari urutan di SQL.) Klausa from menentukan sumber data, klausa where menerapkan filter, dan klausa select menentukan jenis elemen yang dikembalikan. Klausa tersebut dan klausa kueri lainnya dibahas secara rinci di bagian Kueri Terintegrasi Bahasa (LINQ). Untuk saat ini, poin pentingnya adalah bahwa dalam LINQ, variabel kueri itu sendiri tidak mengambil tindakan dan tidak mengembalikan data. Ini hanya menyimpan informasi yang diperlukan untuk menghasilkan hasil ketika kueri dijalankan di beberapa titik kemudian. Untuk informasi selengkapnya tentang bagaimana kueri dibangun di belakang layar, lihat Ringkasan Operator Kueri Standar (C#).
Catatan
Kueri juga dapat diekspresikan dengan menggunakan sintaks metode. Untuk informasi selengkapnya, lihat Sintaksis kueri dan sintaks metode di LINQ.
Eksekusi Kueri
Eksekusi Yang Ditangguhkan
Seperti yang dinyatakan sebelumnya, variabel kueri itu sendiri hanya menyimpan perintah kueri. Eksekusi kueri yang sebenarnya ditangguhkan sampai Anda mengulangi variabel kueri dalam pernyataan foreach. Konsep ini disebut sebagai eksekusi yang ditangguhkan dan ditunjukkan dalam contoh berikut:
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
Pernyataan foreach ini juga di mana hasil kueri diambil. Misalnya, dalam kueri sebelumnya, variabel iterasi num menyimpan setiap nilai (satu per satu) dalam urutan yang dikembalikan.
Karena variabel kueri itu sendiri tidak pernah menyimpan hasil kueri, Anda dapat menjalankannya sesering mungkin. Misalnya, Anda mungkin memiliki database yang sedang diperbarui terus-menerus oleh aplikasi terpisah. Dalam aplikasi Anda, Anda dapat membuat satu kueri yang mengambil data terbaru, dan Anda dapat menjalankannya berulang kali pada beberapa interval untuk mengambil hasil yang berbeda setiap saat.
Memaksa Eksekusi Segera
Kueri yang melakukan fungsi agregasi pada rentang elemen sumber harus terlebih dahulu beralih ke elemen-elemen tersebut. Contoh kueri tersebut adalah Count, Max, Average, dan First. Kueri ini dijalankan tanpa pernyataan eksplisit foreach karena kueri itu sendiri harus menggunakan foreach untuk mengembalikan hasil. Perhatikan juga bahwa jenis kueri ini mengembalikan nilai tunggal, bukan kumpulan IEnumerable. Kueri berikut mengembalikan hitungan angka genap dalam array sumber:
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
int evenNumCount = evenNumQuery.Count();
Untuk memaksa eksekusi langsung kueri apa pun dan menyimpan hasilnya, Anda dapat memanggil metode ToList atau ToArray.
List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
Anda juga dapat memaksa eksekusi dengan menempatkan perulangan foreach segera setelah ekspresi kueri. Namun, dengan memanggil ToList atau ToArray Anda juga menyimpan semua dalam satu objek koleksi.