PDA

View Full Version : استفاده string را در where یک کوئری EF



farashah_jalal
چهارشنبه 07 دی 1390, 10:50 صبح
با سلام
من می خواستم در قسمت where در EFمقدار را به صورت string به سمت اون پاس داد
یعنی من شرطم رو به صورت string بسازم و بعد به اون بدم . مانند datattable.select که به صورت یک رشته string اون query را می گرفت.

mehdi.mousavi
چهارشنبه 07 دی 1390, 11:40 صبح
با سلام من می خواستم در قسمت where در EFمقدار را به صورت string به سمت اون پاس داد یعنی من شرطم رو به صورت string بسازم و بعد به اون بدم . مانند datattable.select که به صورت یک رشته string اون query را می گرفت.

سلام.
در Entity Framework به چند روش میشه Query رو انجام داد. یکی از اونها، استفاده از Object Service ها و Entity SQL بصورت توام هستش. در این روش، شما ObjectQuery رو بطور مستقیم ایجاد می کنید و با استفاده از دستورات EF که شبیه T-SQL هستش (که بهش Entity SQL میگن)، درخواست خودتون رو مطرح می کنید. نوشتن Entity SQL دشوارتر از کار با LINQ to Entities هستش، اما اگر واقعا چاره ای جز ایجاد Query بصورت Dynamic ندارید، می تونید از این روش استفاده کنید. به کد زیر دقت کنید:

using (var context = new MyDbContext())
{
string queryString = "SELECT VALUE c FROM MyDbContext.Contacts AS c WHERE c.FirstName=@firstName";
ObjectQuery<Contact> contacts = new ObjectQuery<Contact>(queryString, context);
contacts.Parameters.Add(new ObjectParameter("firstName", "Mehdi"));

List<Contact> items = contacts.ToList();
}

در کد فوق، من کلیه Contact هایی که FirstName اونها، Mehdi بوده رو Query کرده ام (با استفاده از Entity SQL). همونطوریکه می بینید، Syntax این Query متفاوت از T-SQL هستش... فرضا به VALUE دقت کنید. اون VALUE داره میگه که Query ی من یک Row بر نمی گردونه، بلکه یک Object برمیگردونه (Contact در مثال فوق) و هنگامی استفاده میشه که فقط یک Item در لیست Select ها داریم. همچنین شما می تونید از مجموعه ای از Operator ها، مانند ANYELEMENT، EXISTS، FLATTEN و ... نیز استفاده کنید. اما روش دیگه ای نیز وجود داره که می تونید توسط اون، Entity SQL مورد نظر رو به EF پاس بدید. در این روش، از متودهای Quiery Builder و Entity SQL استفاده می کنیم:

using (var context = new MyDbContext())
{
IQueryable<Contact> contacts = context.Contacts.Where("it.FirstName = 'Mehdi'");
List<Contact> items = contacts.ToList();
}

Query ی فوق، منجر به ساخت Entity SQL اولی میشه و سپس، بر اساس Mapping های موجود، Entity SQL Parser درختی از دستورات مورد نظر (بر اساس نام Entity ها) میسازه، اونو به Store Schema تبدیل می کنه و پس از ساخت Command Tree ی جدیدی (بر اساس نام واقعی جداول و ستون های بانک)، اونو به DB Provider میده و Query انجام میشه. ممکنه بپرسید که اون it در کد فوق چی هستش. اون alias پیش فرض متغیر کنترلی هستش که البته، قابل تغییره (که البته توضیحش خارج از این بحث هستش).

موفق باشید.