نمایش نتایج 1 تا 2 از 2

نام تاپیک: مهفوم و کاربرد Expression Tree چیست؟

  1. #1

    Lightbulb مهفوم و کاربرد Expression Tree چیست؟

    با سلام . مهفوم و کاربرد Expression Tree چیست؟ اگه امکانش هست یه مثال کاربردی ولو خیلی خیلی ساده و کوچیک بهم بگید.
    ممنونم

  2. #2
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: مهفوم و کاربرد Expression Tree چیست؟

    توضیح MSDN رو میتونید بخونید.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>(orderBy CallExpression);

    // 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
    */

تاپیک های مشابه

  1. کاربرد app.config چیست؟
    نوشته شده توسط mf_007 در بخش C#‎‎
    پاسخ: 13
    آخرین پست: جمعه 21 مهر 1391, 19:46 عصر
  2. گفتگو: کاربرد clear selector چیست؟
    نوشته شده توسط Saber Mogaddas در بخش طراحی وب (Web Design)
    پاسخ: 2
    آخرین پست: پنج شنبه 24 شهریور 1390, 19:03 عصر
  3. کاربرد کلمه NoLock چیست؟
    نوشته شده توسط آرام جان گل در بخش T-SQL
    پاسخ: 5
    آخرین پست: سه شنبه 20 اردیبهشت 1390, 13:58 عصر
  4. مبتدی: کاربرد web.config چیست؟
    نوشته شده توسط saed2006 در بخش ASP.NET Web Forms
    پاسخ: 4
    آخرین پست: یک شنبه 27 تیر 1389, 14:58 عصر
  5. سوال: کاربرد کارکتر \r چیست؟
    نوشته شده توسط hamed3 در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 1
    آخرین پست: شنبه 21 فروردین 1389, 13:27 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •