CodeShot
Expression Trees2 دقیقه مطالعه

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 بیشتر برای ساخت و تحلیل منطق و تولید کد به‌کار می‌رود.

حالا امتحان کن

🧩آزمون Expression Trees در C#6 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←