Expression Trees در C# چیست؟
ساختار درختی یک عبارت C# که بهجای اجرا شدن، بهصورت داده ذخیره میشود تا بتوان آن را تحلیل، تغییر یا به SQL ترجمه کرد.
چرا مهم است؟
Expression Tree همان چیزی است که به Entity Framework Core اجازه میدهد یک Lambda را بخواند و به SQL تبدیل کند — بدون آن، LINQ روی دیتابیس اصلاً ممکن نبود.
تعریف کوتاه
Expression Tree ساختاری درختی از یک عبارت C# است که بهجای اجرا شدن مستقیم، بهصورت داده ذخیره میشود تا بتوان تحلیل، تغییر یا ترجمهاش کرد.
using System.Linq.Expressions;
Delegate در برابر Expression Tree
Delegate (اجرا میشود):
Func<int, int> square = x => x * x;
var result = square(5); // 25
Expression Tree (ساختار عبارت را نگه میدارد):
Expression<Func<int, int>> square = x => x * x;
Multiply
/ \
Parameter Constant
میتوان فهمید ورودی چیست، چه عملیاتی انجام میشود و چه متغیرهایی استفاده شدهاند.
کاربردهای مهم
۱. ORMها مثل Entity Framework Core — مهمترین کاربرد:
db.Users.Where(u => u.Age > 18).ToList();
عبارت u => u.Age > 18 به Expression Tree تبدیل و توسط EF Core به SQL ترجمه میشود:
SELECT * FROM Users WHERE Age > 18
۲. ساخت Queryهای Dynamic — مثلاً فیلترهای کاربر در زمان اجرا با Expression<Func<User, bool>> ساخته میشوند.
۳. تحلیل کد در زمان اجرا — بررسی اینکه چه متد/Property استفاده شده؛ پایه Validation Frameworkها، Mapping Frameworkها و Query Builderها.
۴. ساخت کد در Runtime — Expression Tree قابل Compile شدن به Delegate است:
var expression = Expression.Lambda<Func<int,int>>(
Expression.Multiply(Expression.Parameter(typeof(int)), Expression.Constant(2)));
var func = expression.Compile();
Console.WriteLine(func(5)); // 10
اجزای اصلی
| Node | کاربرد |
|---|---|
ParameterExpression |
پارامتر ورودی |
ConstantExpression |
مقدار ثابت |
BinaryExpression |
عملیات مثل + - * / |
MethodCallExpression |
فراخوانی متد |
MemberExpression |
دسترسی به Property |
LambdaExpression |
تابع Lambda |
Expression Tree در برابر Reflection
| Reflection | Expression Tree |
|---|---|
| بررسی Type و Member | ساخت و تحلیل منطق |
| کندتر | معمولاً سریعتر |
| بیشتر برای Metadata | بیشتر برای Query و Code Generation |
نکته کلیدی:
Func<>یک Delegate اجراییست؛Expression<Func<>>نمایش درختی کد است که قابل تحلیل و ترجمه (مثلاً به SQL) است — به همین دلیل EF Core از آن استفاده میکند، نه از Delegate ساده.
خلاصه
- Expression Tree عبارت را بهجای اجرا، بهصورت داده (درخت) نگه میدارد تا قابل تحلیل و ترجمه باشد.
- Entity Framework Core از Expression Tree استفاده میکند تا Lambdaهای LINQ را به SQL تبدیل کند.
- برخلاف Reflection که بیشتر برای بررسی Metadata است، Expression Tree بیشتر برای ساخت و تحلیل منطق و تولید کد بهکار میرود.
