شما اینجا هستید: خانه / مقالات آموزشی / کتابخانه ی Entity Framework Extended – ارسال همزمان Query ها

کتابخانه ی Entity Framework Extended – ارسال همزمان Query ها

در مقدمه به معرفی کتابخانه ی Entity Framework Extended و نحوه ی اضافه کردن آن به پروژه و در بخش اول به نحوه اعمال حذف و ویرایش دسته ای با امکانات این کتابخانه پرداختیم. در این مقاله به یکی از کاربردی ترین امکانات این کتابخانه با نام Future Query می پردازیم.

با استفاده از Future Query ها می توانید لیستی از Query ها را ساخته و تمام آنها را با یک مراجعه (Round Trip) به پایگاه داده اجرا و بازیابی کنید. با استفاده از این تکنیک می توانید تعداد دفعات مراجعه به پایگاه داده را کمتر کرده و بازدهی برنامه ی خود را افزایش دهید. استفاده از Future Query ها بسیار راحت و ساده است، تنها کافی است از متد ()Future در آخر Query های خود استفاده کنید تا لیستی از Query ها بسازید. این Query ها همراه با اولین Query به پایگاه داده فرستاده و اجرا می شود.

  • استفاده از Future برای ارسال و بازیابی چند Query همزمان

فرض کنید برای انجام عملیاتی در سیستم نیاز به بازیابی اطلاعات از دو جدول Member و Course را دارید. در حالت معمول باید از دو Query جدا مانند زیر استفاده نمایید :

 

دو Query فوق با دوبار مراجعه به پایگاه داده اجرا و بازیابی می شوند. حال از متد Future برای بازیابی داده ها استفاده میکنیم :

 

به Query ارسال شده به پایگاه داده توجه نمایید :

 

همانطور که مشاهده میکنید با اولین دسترسی یکی از Future Query ها به پایگاه داده (صدا زدن ToList در دومین Query)، هر دو Query همزمان به پایگاه داده ارسال و بازیابی شدند.

  • استفاده از Future Count هنگام پیاده سازی Paging در صفحات

تقریبا در تمام سناریوهای Paging نیاز به داشتن تعداد واقعی رکوردهای یک Query دارید. در حالت معمول باید از چنین روشی استفاده نمایید :

 

در مثال فوق نیز دو Query به صورت جداگانه اجرا می شوند. یکی جهت بازیابی داده ها برای یک صفحه و دیگری برای بازیابی تعداد مجموع رکورد ها. میتوانید با استفاده از متد FutureCount با یک مراجعه به پایگاه داده، هر دوی آنها را اجرا نمایید :

همانطور که مشاهده میکنید Query های فوق نیز به صورت همزمان اجرا می شوند :

 

در این مقاله Future Query ها و نحوه ی استفاده از آنها جهت افزایش بازدهی و سرعت نرم افزار را بررسی کردیم. در مقاله ی بعد نحوه ی پیاده سازی مکانیزم  Caching برای نتایج Query ها را با استفاده از امکانات کتابخانه ی Entity Framework Extended بررسی خواهیم کرد.

درباره هادی احمدی

هادی احمدی
برنامه نویس، تحلیلگر و طراح نرم افزار که به فعالیت بر روی بسترهای نرم افزاری مایکروسافت مشغول هستم. علاقه مند به مباحث طراحی و معماری نرم افزار و همچنین پیاده سازی سیستم های اطلاعاتی پیچیده می باشم.

11 نظر

  1. اقای مهندس سایتتون واقعا عالیه

  2. سلامئ
    خیلی قابلیت خوب و جذابیه
    مهندس خوب بود که به Fixup هم اشاره می کردی
    کوئری هایی که به این ترتیب زده می شوند در نهایت چون داخل یک کانتکس هستند روابطشون با هم بر قرار می شه ! و تو کد می شه از روابط بین Entity هایی در کوئری های جداگانه اجرا شدند ،استفاده کرد و لذت برد !

  3. ممنون از معرفی این کتابخانه ، فرض کنید این کتابخانه در دسترس نیست.
    نظرتون در مورد باز کردن کانکشن و فراخوانی کوئری ها و بستن کانکشن چیه؟

    • هادی احمدی

      سلام
      روشی که میفرمایید بهتر از باز و بسته کردن کانکشن به ازای هر Query است و هزینه ی کمتری دارد.
      اما همچنان نیاز دارید که به ازای هر Query، یک Round Trip به دیتابیس داشته باشید.

  4. ممنون.
    جالب است که بنده در EF 6 با هاش مشکلی نداشتم ولی جدیدا با EF 6.1.3 کوئری های همزمان ، نتیجه ای رو برنمیگردانند. البته در بازخورد های موجود در مخزن پروژه نیز مطرح شده است.

  5. مشکل حل شد . قبلا به شکل زیر استفاده میکردم.

    // base query
    var q = db.Tasks.Where(t => t.Priority == 2);
    // get total count
    var q1 = q.FutureCount();
    // get page
    var q2 = q.Skip(pageIndex).Take(pageSize).Future();

    // triggers execute as a batch
    int total = q1.Value;
    var tasks = q2.ToList();

    این چیزی بود که در داکیونت خودش هم ارائه شده. و بنده هم استفاده کرده بودم و نتیجه گرفته بودم .
    با حذف فراخوانی پراپرتی Value این مشکل حل شد!!

  6. پروین ترکمان

    عالی بود
    ممنون

دادن پاسخ بهایمان بی خیال پاسخ!

آدرس ایمیلتان منتشر نمیشودگزینه های الزامی ستاره دار شده اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

رفتن به بالا