اجرای کوئری با تاخیر – آموزش LINQ

  • شنبه ۲۹ آبان ۱۴۰۰
  • بازدید ۷۶۳ نفر

تصویر linq-deferred-execution_11129 اجرای کوئری با تاخیر - آموزش LINQ

اجرای کوئری با تاخیر

اجرای با تاخیر (Deferred Execution) به این معنا است که ارزیابی یک عبارت تا زمانی که مقدار واقعی آن مورد نیاز باشد به تأخیر می افتد. با استفاده از این روش می توان کارایی را تا حد زیادی بهبود بخشید.

اجرای با تاخیر در همه مجموعه های in-memory و زیر مجموعه های LINQ مانند LINQ-to-SQL، LINQ-to-Entities، LINQ-to-XML و غیره قابل اعمال است. برای درک بهتر به مثال زیر توجه کنید:

تصویر linq-deferred-execution_1 اجرای کوئری با تاخیر - آموزش LINQ

همانطور که در شکل فوق نشان داده شده است، چون حلقه foreach به نتیجه کوئری نیاز دارد، کوئری تعریف شده اجرا می شود. این همان اجرای با تاخیر است. این روش باعث نمی شود که نتیجه کوئری بعد از اجرا شدن ثابت بماند بلکه در هنگام اجرای دوباره کوئری آخرین تغییرات نیز لحاظ می شود. برای درک بهتر به مثال زیر توجه کنید:

تصویر linq-deferred-execution_2 اجرای کوئری با تاخیر - آموزش LINQ

همانطور که مشاهده می کنید، حلقه دوم دوباره کوئری را اجرا می کند و نتیجه اجرا شامل آخرین تغییرات نیز است. این یعنی هر بار که به نتیجه یا مقدار یک کوئری احتیاج باشد، مقدارش به اصطلاح re-evaluate می شود. به این کار lazy evaluation گفته می شود.

پیاده‌سازی Deferred Execution

با استفاده از کلمه کلیدی yield در زبان سی شارپ می توانید متد افزودنی برای اینترفیس IEnumerable ایجاد کنید که با تاخیر اجرا شود. برای نمونه در مثال زیر ما یک متد افزودنی برای اینترفیس IEnumerable با نام GetTeenAgerStudents ایجاد کرده ایم که لیست دانش آموزان نوجوان را باز می گرداند:

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

خروجی مثال:

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

ثبت نظر
ریفریش کنید!
نظرات کاربران (۰ مورد)

هیچ نظری ثبت نشده است