1 دقیقه میانگین مدت زمان مطالعه است

در زبان برنامه نویسی .net کالکشن های مختلفی وجود دارد که دارای کاربردهای متفاوت هستند و استفاده درست از آنها، باعث جلوگیری از به وقوع پیوستن مشکلات در آینده می‌شود.
سه عدد از معروف ترین این موارد ienumerable و iqueryable و list است که استفاده درست از آنها بخصوص در Repository ها مهم است.

یکی از تفاوت های مهم ienumerable و list در دو تکه کد زیر بیان شده است. فرض کنید لیستی با اسم items داریم که می‌خواهیم مواردی از آن که دارای طول بلندتر از 3 هستند را بدست آوریم و سپس آنها را چاپ کنیم.
اما در بین این موارد یکی از آیتم ها را تغییر می‌دهیم:

var items = new List<string> {"aa", "bbbb", "cc", "ddddd", "e"};
var moreItems = items.Where(w => w.Length > 3);
items[0] = "aaaa";

foreach (var item in moreItems)
{
    Console.WriteLine(item);
}

در کد بالا نوع متغیر moreItems از نوع ienumerable می‌باشد. به همین دلیل فراخوانی آن تا زمان درخواست مقادیر آن به تاخیر می‌افتد.
پس خروجی آن مقادیر زیر است:

  • aaaa
  • bbbb
  • ddddd

اما در کد زیر moreItems توسط .ToList() به List تبدیل شده است و تغییر مقادیر items بر آن اثر نمی‌گذارد.
پس خروجی آن بصورت زیر است:

  • bbbb
  • ddddd
var items = new List<string> {"aa", "bbbb", "cc", "ddddd", "e"};
var moreItems = items.Where(w => w.Length > 3).ToList();
items[0] = "aaaa";

foreach (var item in moreItems)
{
    Console.WriteLine(item);
}

استفاده درست از انواع Collections ها در زمانی که به دیتابیس کوئری می‌زنید، نقش پررنگ تری دارد.

بطور مثال در کدهای زیر از 3 کالکشن نام برده شده، استفاده شد است.
در کد زیر که خروجی آن از نوع IQueryable است، دریافت فقط 1 آیتم نیز به کوئری اعمال می‌شود و سپس به دیتابیس کوئری زده می‌شود.

IQueryable<MyItems> list = db.MyItem.Where(p => p.Name.StartsWith("T"));
var items = list.Take<MyItems>(1);
return items;

اما در کد زیر تمام سطرها که شرط where را برقرار می‌کنند، دریافت می‌شوند و سپس فقط آیتم اول آن دریافت می‌شود.

IEnumerable<MyItems> list = db.MyItem.Where(p => p.Name.StartsWith("T"));
var items = list.Take<MyItems>(1);
return items;

در کد زیر نیز همانند کد بالا عمل می‌شود و تفاوت آن نیز در اوایل پست ذکر شد.
بهتر است خروجی Repository خود را از نوع List تعیین کنید و همان Enumerable را به لایه های دیگر پاس ندهید.

IEnumerable<MyItems> list = db.MyItem.Where(p => p.Name.StartsWith("T"));
var items = list.ToList();
return items;

اطلاعات بیشتر درباره کالکشن ها:

mhkarami97

زمان درست استفاده از انواع کالکشن ها:

mhkarami97

اطلاعات بیشتر:

iqueryable
ienumerable
list