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,4Kueri 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")); // TruePenerjemahan, 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,40Menyusun 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,25Yang 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,4Pemeriksaan Singkat
Pastikan Anda memahami peran pohon ekspresi dalam penyedia LINQ.
Rangkuman
Anda telah mempelajari cara penyedia LINQ menggunakan pohon ekspresi.
IEnumerablemenggunakanFuncyang dikompilasi;IQueryablemenggunakan pohonExpression<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
- Apa Itu Pohon Ekspresi
- Membangun Ekspresi Secara Manual
- Mengompilasi dan Menjalankan Ekspresi
- Pohon Ekspresi pada Penyedia LINQ