کوئری پویا توسط LINQ

شنبه 31 مرداد 1394

در این مقاله ما به شما توضیح میدهیم که چگونه یک کوئری پویا در LINQ ایجاد کنیم. به منظور انجام این کار، شما اول باید مفهوم expression trees (عبارت درختی) رو متوجه شوید.

کوئری پویا توسط LINQ

همانطور که در MSDN داریم : expression trees (عبارت درختی) کدها را همانند ساختار یک درخت نمایش می دهد. به عنوان مثال فراخوانی یک متد یا (عمل دو دیی) از قبیل x < y

به زبانی سادتر، expression trees همانند یک ساختار داده درختی است که می تواند برای نمایش دادن بعضی‌ از کد‌های قابل اجرا استفاده شود. در قالب گره هایی از این درخت. این کد تبدیل به یک کد قابل اجرا خواهد شد. این نوع از Property به شما اجازه خواهد داد که یک کوئری پویا در LINQ ایجاد کنید. پس در نتیجه بیایید با این کد شروع کنیم.

ما یک کوئری LINQ در زیر داریم که نشان دهندهٔ اطلاعات یک مشتری بر اساس CustomerID است.

_dbEntities.Customers.Where(cust => cust.CustomerId == 10).FirstOrDefault();  

حالا ما این کوئری را با ایجاد expression trees به یک کوئری پویا تبدیل می نماییم.
 ابتدا فضای نام System.Linq.Expressions را اضافه می نماییم. این کلاس شامل متدهای Static متفاوتی می باشد که شما می توانید از آنها برای تولید کوئری استفاده نمایید.

این متدها شامل پارامترها، ثابت ها و Property و غیره می باشد. ما از این متد ها برای ایجاد کوئری استفاده می نماییم.

مراحل

مرحله 1

ما در ابتدا پارامتر ورودی ارائه شده توسط کد موجود در سمت چپ اپراتور لامدا (Lamda) را تولید می کنیم، به عبارت دیگر cust => . برای این ما از Expression ها استفاده می نماییم. متد پارامتر که 2 نوغ پارامتر و رشته را پاس می دهند.

ParameterExpression pe = Expression.Parameter(Customer, "cust");  

مرحله 2

بعد ما نیاز به استفاده از پروپرتی CustomerId برای ساخت مقایسه بر اساس مقدار داریم که توسط cust.CustomerId در این کوئری معرفی شده است. بنابراین ما نیاز به گرفتن این پروپرتی و استفاده از Expression داریم. بنابر این داریم :

var _prpToUse = Expression.Property(pe, "CustomerId");  

مرحله 3

حالا ما نیاز به مقایسه CustomerId با مقداری را داریم. بنابراین Expression خودمان را برای استفاده این متد  Expression.Constant مانند زیر تولید می کنیم.

var _cnstToUse = Expression.Constant(10);  

مرحله 4

حال دو Expression قبلی را ترکیب می کنیم تا عبارت cust.CustomerId == 10 تولید شود. برای این هدف از متد Expression.Equal استفاده می کنیم. بنتایراین کد ما می شود :

var qry = Expression.Equal(_prpToUse, _cnstToUse);  

مرحله 5

حالا ما cust => cust.CustomerId == 10 را داریم و نیاز به ترکیب آن با متد Where داریم تا کوئری ما کامل گردد. باری این کار از کد زیر استفاده می کنیم :

MethodCallExpression whereExpression = Expression.Call(  
typeof(Queryable),  
"Where",  
new Type[] { lst.ElementType },  
lst.Expression,  
Expression.Lambda<Func<Customer, bool>>(qry, new ParameterExpression[] { pe })); 

مرحله 6

سرانجام نیاز به اجرای کوئری توسط متد CreateQuery داریم.

lstData.Provider.CreateQuery<Customer>(whereExpression).FirstOrDefault();  

در همه مراحل قبلی به غیر از مرحله 6 ما Expression هایی ساختیم تا با هم ترکیب شوند و یک درخت expression ایجاد نمایند.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید