0Pricing
C# Academy · Pelajaran

Pohon Ekspresi pada Penyedia LINQ

Lihat cara penyedia menerjemahkan ekspresi menjadi kueri.

Pohon Ekspresi pada Penyedia LINQ adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Mengapa LINQ Memerlukan Pohon Ekspresi

LINQ memiliki dua bentuk. IEnumerable<T> menjalankan lambda di memori. IQueryable<T> menerimanya sebagai pohon ekspresi sehingga penyedia dapat menerjemahkannya ke bahasa lain, seperti SQL.

IEnumerable vs IQueryable

Perbedaannya terletak pada tipe parameter: IEnumerable.Where menerima Func<T,bool> (yang dikompilasi), sedangkan IQueryable.Where menerima Expression<Func<T,bool>> (sebuah pohon).

using System;
using System.Linq;
using System.Linq.Expressions;

int[] nums = { 1, 2, 3, 4 };
// IEnumerable path: lambda is a compiled delegate
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(",", evens)); // 2,4

Kueri Tetap sebagai Data

Dengan IQueryable, lambda Anda ditangkap sebagai pohon ekspresi dan belum dijalankan. Penyedia memeriksa pohon tersebut untuk membangun kueri.

using System;
using System.Linq;
using System.Linq.Expressions;

IQueryable<int> q = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
var filtered = q.Where(n => n > 2);
Console.WriteLine(filtered.Expression.NodeType); // Call (a method-call tree)

Memeriksa Ekspresi Kueri

Properti Expression pada objek yang dapat dikuerikan menampilkan pohon yang akan diterjemahkan oleh penyedia.

using System;
using System.Linq;

var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // True

Penerjemahan, Bukan Eksekusi

Penyedia seperti Entity Framework menelusuri pohon dan menghasilkan SQL seperti WHERE Age > 18. Predikat C# Anda tidak pernah dijalankan di klien; basis data yang mengerjakannya.

Peran IQueryProvider

IQueryable menyimpan IQueryProvider. Saat Anda melakukan enumerasi terhadap kueri, penyedia menerima pohon ekspresi dan menentukan cara menjalankannya.

using System;
using System.Linq;

var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)

Eksekusi Tertunda

Pohon hanya diterjemahkan dan dijalankan saat Anda melakukan enumerasi (misalnya, ToList atau foreach). Sampai saat itu, pohon tersebut murni data yang dapat terus Anda susun.

using System;
using System.Linq;

var q = new[] { 1, 2, 3, 4 }.AsQueryable()
    .Where(n => n > 1)
    .Select(n => n * 10);
// nothing has run yet; now force it:
Console.WriteLine(string.Join(",", q.ToList())); // 20,30,40

Menyusun Kueri

Karena setiap operator menambahkan sesuatu ke pohon ekspresi, Anda dapat membangun kueri secara bertahap dan penyedia melihat keseluruhannya saat eksekusi.

using System;
using System.Linq;

var baseQuery = new[] { 5, 15, 25, 35 }.AsQueryable();
var q = baseQuery.Where(n => n > 10);
q = q.Where(n => n < 30); // composed: 10 < n < 30
Console.WriteLine(string.Join(",", q.ToList())); // 15,25

Yang Tidak Dapat Diterjemahkan

Penyedia hanya dapat menerjemahkan operasi yang dipahaminya. Predikat yang memanggil metode C# sembarang dapat menimbulkan pengecualian saat eksekusi karena tidak ada padanan SQL-nya.

Menulis Penyedia Anda Sendiri

Penyedia kustom mengimplementasikan IQueryProvider dan menggunakan ExpressionVisitor untuk menelusuri pohon serta menerjemahkan setiap simpul ke bahasa kueri targetnya.

Menyatukan Semuanya

Di sinilah inti pemahamannya: lambda yang sama menjadi delegat untuk IEnumerable, tetapi menjadi pohon untuk IQueryable, sehingga memungkinkan penerjemahan.

using System;
using System.Linq;
using System.Linq.Expressions;

Expression<Func<int, bool>> predicate = n => n > 2;
var data = new[] { 1, 2, 3, 4 };
// IEnumerable needs a delegate:
Console.WriteLine(string.Join(",", data.Where(predicate.Compile()))); // 3,4
// IQueryable accepts the tree directly:
Console.WriteLine(string.Join(",", data.AsQueryable().Where(predicate))); // 3,4

Pemeriksaan Singkat

Pastikan Anda memahami peran pohon ekspresi dalam penyedia LINQ.

Rangkuman

Anda telah mempelajari cara penyedia LINQ menggunakan pohon ekspresi.

  • IEnumerable menggunakan Func yang dikompilasi; IQueryable menggunakan pohon Expression<Func>.
  • Penyedia menerjemahkan pohon (misalnya, ke SQL) alih-alih menjalankannya.
  • Eksekusi ditunda hingga enumerasi dilakukan.
  • Hanya operasi yang dapat diterjemahkan yang berfungsi; metode sembarang dapat gagal.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pohon Ekspresi pada Penyedia LINQ” gratis?

Ya — teks lengkap “Pohon Ekspresi pada Penyedia LINQ” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pohon Ekspresi pada Penyedia LINQ”?

Lihat cara penyedia menerjemahkan ekspresi menjadi kueri. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Pohon Ekspresi pada Penyedia LINQ” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Apa Itu Pohon Ekspresi
  2. Membangun Ekspresi Secara Manual
  3. Mengompilasi dan Menjalankan Ekspresi
  4. Pohon Ekspresi pada Penyedia LINQ
← Kembali ke C# Academy