آشنایی با Expression در LINQ
عبارت لامبدا را می توان در delegate هایی از نوع Action و Func ذخیره کرد. کامپایلر .NET در زمان کامپایل عبارت لامبدا ذخیره شده در یک Action یا Func را به کد قابل اجرا تبدیل می کند. زبان کوئری نویسی LINQ یک نوع داده جدید به نام Expression معرفی کرد که می تواند یک عبارت لامبدا را در خود نگه دارد. تفاوتی که با Action و Func دارد این است که کامپایلر به جای تبدیل آن به کد اجرایی آن را به Expression Tree تبدیل می کند.
تعریف یک Expression
برای کار با نوع داده Expression لازم است تا فضای نام System.Linq.Expressions را به برنامه اضافه کنید. الگوی یک Expression به صورت Expression<TDelegate> است و این نشان دهنده این است که نوع یک Expression می تواند یک delegate از نوع Action یا Func باشد. برای درک بهتر به مثال زیر توجه کنید:
1 2 3 4 5 6 7 | 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; |
در مثال فوق ما یک عبارت لامبدا را در متغیر isTeenAger که یک Func است ذخیره کردیم. حال می توانیم آن را مانند نمونه زیر به یک Expression تبدیل کنیم:
1 | Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; |
مشابه این کار را می توانید بر روی Action ها هم انجام دهید. برای مثال:
1 | Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName); |
تا به اینحا ما Expression را ایجاد کردیم. در ادامه نحوه اجرای آن را بررسی می کنیم.
اجرای یک Expression
همانطور که دید یک Expression در داخل خود یک delegate را ذخیره می کند. با استفاده از متد Compile مربوط به Expression می توانیم به آن delegate دسترسی داشته باشیم و در نتیجه می توانیم آن را اجرا کنیم. برای درک بهتر به مثال زیر توجه کنید:
1 2 3 4 5 | Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; //compile Expression using Compile method to invoke it as Delegate Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile(); //Invoke bool result = isTeenAger(new Student(){ StudentID = 1, StudentName = "Steve", Age = 20}); |
هیچ نظری ثبت نشده است