کوئری با تاخیر
بسم الله الرحمن الرحیم
آموزش لینک
در بخش های آموزش Linq در مورد کوئری های با تاخیر به صورت مختصر صحبت شد اما برای درک بهتر نیاز دیدم تا یک مثال را بررسی کنیم تا در صورتی که مطلب کاملا روشن نشده است در اینجا به طور کامل مشخص گردد.
این مثال در نظر بگیرید:
int[] price = new int{6500,5000,7800,9000,4800};
var result= price.Order().Take(3);
price[5]=999999;
foreach(var p in result)
{
Console.WriteLine(p);
}
خوب در خط اول یک آرایه را با 5 عنصر تعریف کرده ایم در خط بعد با استفاده از لینک و عبارت لامبدا آنها را مرتب و سپس سه عنصر ابتدایی را انتخاب کرده ایم در خط بعد یک عنصر جدید به آرایه اضافه کرده ایم و درنهایت سه مقداری که انتخاب کرده بودیم را چاپ کرده ایم.
نظر شما چیست ؟ چه اعدادی چاپ می شوند (اعداد را به صورت صعودی مرتب کرده ایم)؟
9000
7800
6500
کاملا اشتباه است !!
خروجی صحیح اعداد زیر است:
999999
9000
7800
کوئری با تاخیر همین است تا وقتی که ما کوئری را اجرا نکرده باشیم هر تغییر برروی منبع داده صورت گیرد اعمال خواهد شد امیداوارم کاملا مسئله روشن شده باشد و در ضمن بتوانید درک کنید چقدر می تواند مفید باشد.
همین مثال را با کوئری های سریع تست می کنیم:
int[] price = new int{6500,5000,7800,9000,4800};
var result= price.Sum();
price[5]=999999;
Console.WriteLine(result)
دستور sum یکی از دستورهایی است که سریع اجرا می شود پس خط بعد از آن تاثیری بر روی نتیجه ندارد.
استفاده مجدد از کوئری های با تاخیر
int[] price = new int{6500,5000,7800,9000,4800};
var result= price.Order().Take(3);
foreach(var p in result)
{
Console.WriteLine(p);
}
Console.WriteLine("End ----------------------------------------------------------End");
price[5]=999999;
foreach(var p in result)
{
Console.WriteLine(p);
}
این مثال مانند مثال اول است با این تفاوت که ما قبل از تغییر آرایه آن را چاپ وپس از تغییر آن را مجددا چاپ کردیم،این مثال این مسئله را روشن می کند که به ازای هر بار اجرا کوئری با تاخیر موارد مجددا به صورت خودکار بررسی خواهند شد.
خروجی مثال:
9000
7800
6500
End ----------------------------------------------------------End
999999
9000
7800
امیدوارم مسائل را کاملا توانسته باشم معرفی کنم.
یا علی