Pokok Ungkapan dalam Penyedia LINQ
Lihat cara penyedia menterjemahkan ungkapan menjadi pertanyaan.
Pokok Ungkapan dalam Penyedia LINQ ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Mengapa LINQ Memerlukan Pepohon Ungkapan
LINQ mempunyai dua bentuk. IEnumerable<T> menjalankan lambda dalam memori. IQueryable<T> menerimanya sebagai pepohon ungkapan supaya penyedia boleh menterjemahkannya kepada bahasa lain seperti SQL.
IEnumerable berbanding IQueryable
Perbezaannya terletak pada jenis parameter: IEnumerable.Where mengambil Func<T,bool> (telah dikompil), manakala IQueryable.Where mengambil Expression<Func<T,bool>> (sebuah pepohon).
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 Kekal sebagai Data
Dengan IQueryable, lambda anda ditangkap sebagai pepohon ungkapan dan belum dilaksanakan. Penyedia memeriksa pepohon itu untuk membina 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 Ungkapan Kueri
Sifat Expression pada objek boleh kueri mendedahkan pepohon 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")); // TruePenterjemahan, Bukan Pelaksanaan
Penyedia seperti Entity Framework menelusuri pepohon dan menghasilkan SQL seperti WHERE Age > 18. Predikat C# anda tidak pernah berjalan pada klien; pangkalan data yang melakukan kerja tersebut.
Peranan IQueryProvider
IQueryable menyimpan IQueryProvider. Apabila anda menghitung kueri, penyedia menerima pepohon ungkapan dan menentukan cara melaksanakannya.
using System;
using System.Linq;
var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)Pelaksanaan Tertunda
Pepohon hanya diterjemah dan dijalankan apabila anda melakukan enumerasi (contohnya ToList atau foreach). Sehingga itu, pepohon tersebut ialah data tulen yang boleh terus anda gabungkan.
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,40Menggabungkan Kueri
Oleh sebab setiap operator menambah sesuatu kepada pepohon ungkapan, anda boleh membina kueri secara berperingkat dan penyedia akan melihat keseluruhannya semasa pelaksanaan.
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,25Perkara yang Tidak Boleh Diterjemah
Penyedia hanya boleh menterjemah operasi yang difahaminya. Predikat yang memanggil kaedah C# sewenang-wenangnya mungkin mencetuskan ralat semasa pelaksanaan kerana tiada padanan SQL.
Menulis Penyedia Sendiri
Penyedia tersuai melaksanakan IQueryProvider dan menggunakan ExpressionVisitor untuk menelusuri pepohon serta menterjemah setiap nod kepada bahasa kueri sasaran.
Menggabungkan Semuanya
Ini menunjukkan pandangan utama: lambda yang sama ialah delegat untuk IEnumerable tetapi pepohon untuk IQueryable, lalu membolehkan penterjemahan.
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,4Semakan Pantas
Sahkan peranan pepohon ungkapan dalam penyedia LINQ.
Imbas Kembali
Anda telah mempelajari cara penyedia LINQ menggunakan pepohon ungkapan.
IEnumerablemenggunakanFuncyang telah dikompil;IQueryablemenggunakan pepohonExpression<Func>.- Penyedia menterjemah pepohon itu (contohnya kepada SQL) dan bukannya menjalankannya.
- Pelaksanaan ditangguhkan sehingga enumerasi.
- Hanya operasi yang boleh diterjemah akan berfungsi; kaedah sewenang-wenangnya mungkin gagal.
Pelajari C# dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Soalan Lazim
Adakah pelajaran “Pokok Ungkapan dalam Penyedia LINQ” percuma?
Ya — teks penuh “Pokok Ungkapan dalam Penyedia LINQ” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pokok Ungkapan dalam Penyedia LINQ”?
Lihat cara penyedia menterjemahkan ungkapan menjadi pertanyaan. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Pokok Ungkapan dalam Penyedia LINQ” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?
Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Apakah Pokok Ungkapan
- Membina Ungkapan Secara Manual
- Mengompil dan Melaksanakan Ungkapan
- Pokok Ungkapan dalam Penyedia LINQ