در مطلب های پیشین تا اندازه ای در مورد Entity Framework، رویکرد Code First، ایجاد کلاس موجودیت و انجام عملیات های CRUD (کوتاه شده Create – Read – Update – Delete) بوسیله تابع های ()Add و ()AddRange و ()Remove از کلاس DbContext صحبت کردیم. همچنین در مورد برخی از متدهای LINQ مانند ()First و ()Find و ()Count و ()Any نیز صحبت شده است. در این مطلب نخست در مورد LINQ انجام کوئری بوسیله آن صحبت می شود و از مطلب های پیش رو، تلاش شده تا گونه های متفاوت کوئری بوسیله LINQ در Entity Framework آموزش داده شود.

DbSet از کلاس پایه ای به نام IQueryable مشتق شده است، از این رو می توانیم درون Entity Framework از LINQ برای انجام کوئری روی نمونه های DbSet کمک بگیریم. اگر به یاد داشته باشید در کلاس Context، خصوصیت های <DbSet<Entity به یک جدول از پایگاه داده اشاره می کنند که این جدول بوسیله کلاس موجودیت تعریف شده است. شکل های زیر جهت یاد آوری، نخست کلاس موجودیت به نام User را ایجاد و سپس کلاس Context و خصوصیت DbSet را تعریف کرده است.

در شکل سوم زیر و درون عبارت using نوع متغیر context را به صورت صریح UserContext تعریف کرده ایم در حالی که در مطلب های پیشین آنرا غیر صریحو بوسیله فرمان var تعریف کرده بودیم. کدهای شکل های زیر در مطلب های پیش رو به عنوان جدول و پایگاه داده برای ارائه آموزش مورد استفاده قرار می گیرند.

LINQ چیست

در برنامه نویسی NET. واژه LINQ (کوتاه شده Language-Integrated Query) به مجموعه ای از تکنولوژی ها اشاره دارد که هدف آن، آوردن ویژگی های یک زبان پرس و جوی یکپارچه برای دسترسی به منابع داده متفاوت از درون برنامه های NET. مانند سی شارپ است. در برنامه های NET. منابع داده (Data Source) متفاوتی مانند پایگاه داده های رابطه ای، فایل های XML، وب سرویس ها (Web Service) و حتی مجموعه ها (Collections) مانند لیست ها (List) وجود دارند.

LINQ ساختاری شبیه به زبان SQL دارد که با کمک آن می توانیم داده ها را از منابع متفاوت واکشی و سپس فرمت کنیم. در مطلب های پیش رو خواهید دید که LINQ را می توان به دو شیوه یا نحو متدی (Method Syntaxt) یا نحو کوئری (Query Syntaxt) استفاده کنیم. آنچه که در مطلب های پیشین و باس استفاده از متدی مانند ()First آموزش دادیم، نشان دهنده شیوه متدی بوده است. در کد شکل زیر نخست یک آرایه از نام ها (رشته ها) تعریف شده است و سپس به دو شیوه متدی و کوئری، تمامی نام هایی از آرایه بدست می آید که کاراکتر نخست آنها واژه A باشد.

همانطور که در کد شکل بالا می بینید، LINQ در شیوه کوئری (Query Syntaxt) ساختاری شبیه به زبان پرس و جوی SQL در پایگاه داده های رابطه ای دارد. در کد بالا، متغیر selectedNames که نتیجه LINQ را در خود نگه می دارد، توسط دستور var اعلان شده است. سپس درون حلقه foreach و در هر گام و تا زمانی که عنصری درون seletedNames وجود داشته باشد، نام های استخراج شده، درون متغیر name ریخته شده و سپس بوسیله متد ()WriteLine نمایش داده می شوند. کد شکل زیر یک لیست از رشته ها را ایجاد می کند و سپس تمامی نام هایی را انتخاب می کند که شامل واژه a باشند.

بارگذاری تمامی داده های جدول به درون یک لیست

در مطلب های پیشین چگونگی بدست آوردن تمامی سطرهای جدول را آموزش داده ایم. در مطلب می خواهیم یک بار دیگر مرور کنیم ولی جنبه ساده دیگری را برای ذخیره سازی سطرها در غالب یک لیست را نشان دهیم. در کدهای زیر تمامی سطرهای جدول Users که در بالا به صورت کلاس موجودیت User تعریف کرده بودیم، واکشی شده و سپس توسط متد ()ToList در غالب لیست ذخیره می شوند. خروجی متد ()GetType در کد شکل زیر به صورت [System.Collections.Generic.List`1[EFCodeFirstWhere.User است.

عبارت لامبدا

لامبدا در سی شارپ، تابع بی نام (Anonymous) هستند که می توانند به عنوان ورودی به دیگر توابع فرستاده شوند و اینکه به عنوان مقدار برگشتی در فراخوانی یک تابع باشند. همانطور که در مطلب های پیش رو خواهید دید، در برنامه نوسی سی شارپ، عبارت لامبدا درکوئری نویسی با LINQ کاربرد فراوانی دارند.

عبارت لامبدا شامل دو بخش پارامترها (Parameters) و بخش عبارت (Expression) می شود که میان این دو بخش، عملگر <= قرار می گیرد. بخش پارامترها می تواند شامل یک یا چند پارامتر باشد که در بخش دیگر روی این پارامترها فرمان هایی انجام می شود. به طور مثال یک عبارت لامبدا می تواند x => x * x باشد که تنها دارای یک پارامتر به نام x است که در بخش دیگر، x در خودش ضرب می شود. در واقع ورودی عبارت لامبدا پارامتر x و خرجی آن بتوان دو x است. به طور مثال اگر x=2 باشد، خروجی لامبدا برابر با 4 خواهد بود.

همچنین عبارت لامبدا می توانید بیش از یک پارامتر را دریافت کند. به طور مثال می خواهیم توسط یک عبارت لامبدا بررسی کنیم که آیا مقدار دو پارامتر یکسان است یا خیر. برای این منظور عبارت لامبدا به صورت x, y) => x == y) نوشته می شود. همانطور که می بینید پارامترها میان پرانتزها و با ویرگول از هم جدا شده اند. به طور کلی الگوی چند پارامتری در عبارت لامبدا به صورت زیر است.

در کد شکل های زیر زیر یک آرایه از عددها تعریف شده است که می خواهیم تعداد عددهای زوج را پیدا کنیم. در کد شکل سمت راست، از عبارت if استفاده شده است و در کد شکل سمت چپ از عبارت لامبدا استفاده شده است. متد ()Count در کد سمت، چپ، در نهایت تعداد عددهای زوج را مشخص می کند.

بررسی اینکه آیا شی داده درون جدول وجود دارد

متد ()Any از LINQ برای بررسی اینکه آیا سطری برگشت داده شده یا نه کاربرد دارد. در کد زیر می خواهیم بررسی آیا از میان تمامی سطرهای برگشت داده شده سری وجود دارد که خصوصیت LastName آن برابر با Ahmadi Nami باشد. توجه کنید در کد زیر Users همان خصوصیت <SbSet<Entity در کلاس Context است و متغیر allUsers نمونه (شی) از نوع DbSet خواهد بود پس همانطور که گفتیم می توانیم توسط LINQ روی آن کوئری انجام دهیم. همچنین گفتیم به دو شیوه متدی (Method Syntaxt) و کوئری (Query Syntaxt) می توانیم از LINQ استفاده کنید که در مورد کد زیر، روش متدی به کار رفته است.

دانلود سورس برنامه های این مطلب Entity Framework LINQ Query