Query expression menuliskan kueri dengan klausa yang menyerupai SQL: from menyatakan sumber, where menyaring, orderby mengurutkan, dan select menentukan hasil. Gaya penulisan ini paling nyaman untuk kueri sederhana karena alur datanya terbaca dari atas ke bawah. Kita mulai dari bentuk dasarnya sebelum melihat bentuk asli yang dibangkitkan compiler pada bab Method Syntax.

Bentuk Dasar Query Expression #

Contoh berikut mencari produk berharga di bawah Rp20000 lalu menyusun namanya secara alfabetis:

csharp
record Produk(string Nama, string Kategori, int Harga, int Stok);

List<Produk> produk = new()
{
    new Produk("Kopi Gayo", "Minuman", 25000, 40),
    new Produk("Teh Melati", "Minuman", 15000, 60),
    new Produk("Roti Bakar", "Makanan", 12000, 25),
    new Produk("Susu UHT", "Minuman", 20000, 35),
    new Produk("Keripik Singkong", "Makanan", 10000, 80)
};

var produkMurah = from p in produk
                  where p.Harga < 20000
                  orderby p.Nama
                  select p.Nama;

foreach (string nama in produkMurah)
{
    Console.WriteLine(nama);
}

Output yang Dihasilkan:

text
Keripik Singkong
Roti Bakar
Teh Melati

Mari kita bedah baris demi baris:

  1. record Produk(...): positional record menyimpan data contoh; perilakunya sudah dibahas pada section Struct, Record, dan Enum.
  2. from p in produk: range variable p mewakili satu Produk pada setiap langkah kueri.
  3. where p.Harga < 20000: tiga produk lolos syarat harga; sisanya tidak diteruskan.
  4. orderby p.Nama: hasil disusun menaik menurut abjad nama.
  5. select p.Nama: hasil kueri berupa IEnumerable<string>, bukan kumpulan Produk, karena hanya nama yang dipilih.

Klausa yang Didukung #

Query expression menyediakan klausa berikut:

  • from — sumber data dan range variable
  • where — syarat penyaringan, boleh lebih dari satu
  • orderby — urutan menaik (ascending) atau menurun (descending)
  • select — bentuk hasil
  • group ... by — pengelompokan, dibahas pada bab Grouping
  • join ... on ... equals — penggabungan dua koleksi, dibahas pada bab Joining

Daftar klausa tersebut lebih pendek daripada daftar operator LINQ. Operator seperti Count, First, dan Sum tidak memiliki padanan klausa, sehingga kueri yang memerlukannya tetap memakai pemanggilan method. Kedua gaya pun boleh dipakai bersama pada satu ekspresi yang sama.