PDA

View Full Version : سوال: مهفوم و کاربرد Expression Tree چیست؟



Arcsinos
سه شنبه 13 فروردین 1392, 18:00 عصر
با سلام . مهفوم و کاربرد Expression Tree چیست؟ اگه امکانش هست یه مثال کاربردی ولو خیلی خیلی ساده و کوچیک بهم بگید.
ممنونم

plus
سه شنبه 13 فروردین 1392, 19:32 عصر
توضیح MSDN (http://msdn.microsoft.com/en-us/library/bb397951.aspx)رو میتونید بخونید.ExpressionTree یک عبارت قابل اجراست که در قالب یک درخت، در زمان اجرا میتونه ساخته بشه، کامپایل بشه و اجرا بشه.
فایدش تهیه یک قطعه که (به صورت داینامیک) در زمان اجراست.
برای مثال، فرض کنید شما بر اساس یک مقداری که در زمان اجرا مشخص میشه، مثلا ورودی کاربر، میخواین یک کدی رو اجرا کنید به صورتی که ورودی های متفاوت روی عبارتی که اجرا میکنید تاثیر میگذاره.یکی از روش های سنتی این کار، استفاده از شرط های if به صورت static هست.یعنی شما بگی مثلا اگه ورودی کاربر بیشتر از x بود مقدار a * b به فلان متد ارسال بشه، اگه ورودی کاربر کمتر از x بود مقدار c * b fi به یک متد دیگه ارسال بشه و ... . خوب، در شرایطی، استفاده از روش دینامیک و ساختن یک عبارت قابل اجرا، بجای استفاده از شرط های مختلف در کد به صورت static، میتونه بهتره باشه.
اگه شما با LINQ کار کرده باشید، مثال قابل درک تری که میشه زد، اینه که فرض کنید که برنامه شما قراره به کاربر امکان جستجو بر اساس فیلد های مختلف روی یک جدول رو بده.کاربر میتونی بعضی فیلد ها رو وارد نکنه، یا مشخص کنه که شرط بین فیلد ها AND یا OR باشه و ... . خوب، اگه بخواین به روش سنتی عمل کنید، باید بر اساس اینکه کاربر کدوم فیلد ها رو پر کرده یا نکرده و...هر بار یک select مجزا بنویسید.یعنی تعداد زیادی شرط بگذارید و در هر شرط یک select بگذارید.بجای این کار شما عبارت Expression رو به صورت داینامیک بسازید (البته اینجا نیاز به استفاده از شرطها دارید، ولی لزومی نداره درون هر کدوم یک select بنویسید)، و بعد عبارت رو به یک Where لینک، تبدیل و کامپایل کنید و با دادن اون delegate به متد select، عبارت ساخته شده رو اجرا کنید.
اینم مثالی که در MSDN هست:

// The IQueryable data to query.
IQueryable<String> queryableData = companies.AsQueryable<string>();

// Compose the expression tree that represents the parameter to the predicate.
ParameterExpression pe = Expression.Parameter(typeof(string), "company");

// ***** Where(company => (company.ToLower() == "coho winery" || company.Length > 16)) *****
// Create an expression tree that represents the expression 'company.ToLower() == "coho winery"'.
Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
Expression right = Expression.Constant("coho winery");
Expression e1 = Expression.Equal(left, right);

// Create an expression tree that represents the expression 'company.Length > 16'.
left = Expression.Property(pe, typeof(string).GetProperty("Length"));
right = Expression.Constant(16, typeof(int));
Expression e2 = Expression.GreaterThan(left, right);

// Combine the expression trees to create an expression tree that represents the
// expression '(company.ToLower() == "coho winery" || company.Length > 16)'.
Expression predicateBody = Expression.OrElse(e1, e2);

// Create an expression tree that represents the expression
// 'queryableData.Where(company => (company.ToLower() == "coho winery" || company.Length > 16))'
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<string, bool>>(predicateBody, new ParameterExpression[] { pe }));
// ***** End Where *****

// ***** OrderBy(company => company) *****
// Create an expression tree that represents the expression
// 'whereCallExpression.OrderBy(company => company)'
MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderBy",
new Type[] { queryableData.ElementType, queryableData.ElementType },
whereCallExpression,
Expression.Lambda<Func<string, string>>(pe, new ParameterExpression[] { pe }));
// ***** End OrderBy *****

// Create an executable query from the expression tree.
IQueryable<string> results = queryableData.Provider.CreateQuery<string>(orderByCallExpression);

// Enumerate the results.
foreach (string company in results)
Console.WriteLine(company);

/* This code produces the following output:

Blue Yonder Airlines
City Power & Light
Coho Winery
Consolidated Messenger
Graphic Design Institute
Humongous Insurance
Lucerne Publishing
Northwind Traders
The Phone Company
Wide World Importers
*/