أشجار التعبيرات في موفّري LINQ
تعرّفوا على كيفية ترجمة الموفّرين للتعبيرات إلى استعلامات
أشجار التعبيرات في موفّري LINQ درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا يحتاج LINQ إلى أشجار التعبيرات
لدى LINQ نمطان. ينفّذ IEnumerable<T> lambdas في الذاكرة. أما IQueryable<T> فيستقبلها على هيئة أشجار تعبيرات، كي يتمكن موفّر من ترجمتها إلى لغة أخرى مثل SQL.
IEnumerable مقارنةً بـ IQueryable
يكمن الفرق في نوع المعلمة: يأخذ IEnumerable.Where النوع Func<T,bool> (تعليمة مجمّعة)، بينما يأخذ IQueryable.Where النوع Expression<Func<T,bool>> (شجرة).
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يبقى الاستعلام في صورة بيانات
مع IQueryable، تُلتقط lambda الخاصة بكم على هيئة شجرة تعبيرات ولا تُنفَّذ بعد. ويفحص الموفّر الشجرة لإنشاء استعلام.
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)فحص تعبير استعلام
تكشف الخاصية Expression في الاستعلام القابل للاستعلام الشجرة التي سيترجمها الموفّر.
using System;
using System.Linq;
var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // Trueترجمة لا تنفيذ
يمرّ موفّر مثل Entity Framework عبر الشجرة ويصدر SQL مثل WHERE Age > 18. ولا تُنفَّذ predicate الخاصة بكم في C# على العميل؛ بل تنفّذ قاعدة البيانات العمل.
دور IQueryProvider
يحتوي IQueryable على IQueryProvider. وعند تعداد الاستعلام، يستقبل الموفّر شجرة التعبيرات ويقرر كيفية تنفيذها.
using System;
using System.Linq;
var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)التنفيذ المؤجل
لا تُترجم الشجرة وتُشغَّل إلا عند تعدادها، مثلًا باستخدام ToList أو foreach. وحتى ذلك الحين، تظل بيانات خالصة يمكنكم مواصلة تركيبها.
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تركيب الاستعلامات
بما أن كل عامل يضيف إلى شجرة التعبيرات، يمكنكم إنشاء استعلام على مراحل، وسيرى الموفّر الاستعلام كاملًا عند وقت التنفيذ.
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ما لا يمكن ترجمته
لا يستطيع الموفّرون ترجمة إلا العمليات التي يفهمونها. وقد تؤدي predicate التي تستدعي أسلوب C# عشوائيًا إلى استثناء أثناء التنفيذ، لعدم وجود مقابل لها في SQL.
كتابة موفّركم الخاص
ينفّذ الموفّرون المخصصون IQueryProvider ويستخدمون ExpressionVisitor للتنقل في الشجرة وترجمة كل عقدة إلى لغة الاستعلام المستهدفة.
تجميع المفاهيم
يوضح هذا الفكرة الأساسية: تكون lambda نفسها delegate مع IEnumerable، لكنها تكون شجرة مع IQueryable، مما يتيح ترجمتها.
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اختبار سريع
تأكدوا من دور أشجار التعبيرات في موفّري LINQ.
مراجعة
تعلّمتم كيفية استخدام موفّري LINQ لأشجار التعبيرات.
- يستخدم
IEnumerableالنوعFuncالمجمّع، بينما يستخدمIQueryableأشجارExpression<Func>. - يترجم الموفّرون الشجرة، مثلًا إلى SQL، بدلًا من تنفيذها.
- يؤجَّل التنفيذ حتى التعداد.
- لا تعمل إلا العمليات القابلة للترجمة؛ وقد تفشل الأساليب العشوائية.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «أشجار التعبيرات في موفّري LINQ» مجاني؟
نعم — نص درس «أشجار التعبيرات في موفّري LINQ» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أشجار التعبيرات في موفّري LINQ»؟
تعرّفوا على كيفية ترجمة الموفّرين للتعبيرات إلى استعلامات تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أشجار التعبيرات في موفّري LINQ»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما أشجار التعبيرات؟
- إنشاء التعبيرات يدويًا
- ترجمة التعبيرات وتنفيذها
- أشجار التعبيرات في موفّري LINQ