English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يمكن تخصيص تعبيرات lambda إلى وكلات Func أو Action لتعامل المجموعات في الذاكرة. يقوم معالج.NET بتحويل تعبيرات lambda التي تخصيصها إلى وكلات Func أو Action إلى كود قابل للتنفيذ عند التجميع.
LINQ قدم نوع جديد يُدعى Expression، يمثل تعبيرات lambda من النوع القوي. هذا يعني أن تعبيرات lambda يمكن تخصيصها أيضًا إلى نوع Expression <TDelegate>. يقوم معالج.NET بتحويل تعبيرات lambda التي تخصيصها إلى Expression <TDelegate> إلى شجرة تعبيرات، بدلاً من كونها كود قابل للتنفيذ. يستخدم بروتوكول الاستعلام LINQ هذا شجرة التعبيرات كنموذج بيانات، لبناء استعلامات تشغيل الوقت (مثل LINQ-to-SQL، EntityFramework أو أي بروتوكول استعلام LINQ آخر يحقق واجهة IQueryable <T>).
الشكل التالي يوضح الفرق بين تخصيص تعبير lambda إلى وكلات Func أو Action وExpression في LINQ.
في الفصل التالي، سنتعلم عن شجرة التعبيرات، لكن دعونا أولاً نرى كيف يمكننا تعريف وتشغيل التعبيرات.
الإشارةSystem.Linq.Expressionsاسم المجال، واستخدم Expression <TDelegate> لتحديد Expression. يحتاج Expression <TDelegate> إلى نوع الوفد Func أو Action.
على سبيل المثال، يمكنك تعيين تعبير lambda إلى متغير الوفد نوع Func هو isTeenAger كما يلي:
public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int Age { get; set; } } Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;مثال: تعريف الوفد Func للتعبير في VB.Net
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
الآن، يمكنك استخدام Expresson لتغليف الوفد Func، وتحويل نوع الوفد Func إلى Expression كما يلي:
مثال: تعريف التعبير في C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
مثال: تعريف التعبير في VB.Net
Dim isTeenAgerExpr As Expression(Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20
بشكل مماثل، إذا لم تكن تعود من الوفد، يمكنك أيضًا استخدام Expression لتغليف نوع الوفد Action <t>.
مثال: تعريف التعبير في C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
مثال: تعريف التعبير في VB.Net
Dim printStudentName As Expression(Action(Of Student) = Function(s) Console.WriteLine(s.StudentName);
لذلك، يمكنك تعريف نوع Expression <TDelegate>. دعنا نرى كيف يمكننا استدعاء الوفد المدمج من قبل Expression <TDelegate>.
يمكنك استدعاء التمثيل الذي يحتوي عليه Expression بطريقة مشابهة لتمثيل التعهد، ولكن يجب أولاً استخدامه Compile() لتحويله. Compile() يعودFuncأوActionنوع تمثيل تعهد، مما يمكنك من استدعاؤه مثل تمثيل تعهد
مثال: استدعاء التعبير في C#
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; //استخدام Compile لتحويل Expression إلى تمثيل تعهد يمكن استدعاؤه Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile(); //Invoke bool result = isTeenAger(new Student() { StudentID = 1, StudentName = "Steve", Age = 20 });
Dim isTeenAgerExpr As Expression(Of Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20 استخدام طريقة compile لتحويل التعبير إلى تمثيل تعهد يمكن استدعاؤه Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20 })
في الفصل التالي، سيتم توضيح شجرة التعبيرات بشكل مفصل.