قطعا زمانهایی برای شما هم پیش آماده که بین استفاده این دو گزینه گیج شده باشید و بخواهید تفاوت بین آنها را بدانید. بهترین راه برای تصمیم گیری این است که بدانید هریک از این دو گزینه چه کاری انجام میدهند و برای چه سناریویی کارایی بهتری دارند.
رابط (interface) که در فضاینام System.Collection است، متمرکز به جستجو در دادههای in-Memory است، درحالیکه IQueryable برای واکشی دادهها از منابع خارج از حافظه(out-Memory) مثل پایگاهداده، فایلها، سرویسها و ... است.
در سناریو مربوط به واکشی داده از پایگاه دادهای مثل sql بهترین توضیح میتواند عکس زیر باشد.
همانطور که مشاهده میکنید در کد فرضی :
EmpEntities ent = new EmpEntities(); IEnumerable<Employee> emp = ent.Employees; IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
ابتدا تمام دادهها از پایگاه داده واکشی شده، به حافظه منتقل میشوند و در آنجا فیلتر اعمال میگردد. اما اگر شما از IQueryable استفاده کنید با حالتی شبیه به شکل زیر مواجه خواهید بود:
نمونه کد برای حالت فوق:
EmpEntities ent = new EmpEntities(); IQueryable<Employee> emp = ent.Employees; IQueryable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
در این حالت، ابتدا در پایگاه داده فیلتر اعمل میشود و سپس داده فیلتر شده به حافظه سمت کلاینت منتقل میشود.
بطور خلاصه میتوان گفت، در سناریو که داده کم حجم است یا داده در دفعات زیاد و گزینههای فیلتر متفاوت قرار بر ارجاع به داده باشد، قطعا استفاده از IEnumerable برای کش کردن و نیز جستجو با سرعت بالاتر(در اکثر اوقاع حافظه RAM سمت کلاینت سرعت بالاتری از جستجو در سرور دارند) بهتر است اما در حالتی که داده حجم زیادی دارد میتوان با ابتدا داده را سمت سرور فیلتر و نتیجه نهایی با حجم کم را سمت کلاینت فرستاد.
استفاده از IEnumerable سربار سمت سرور را کاهش میدهد اما بخاطر انتقال تمام داده به کلاینت پهنای باند بیشتری نیاز دارد و حافظه بیشتر از کلاینت را مشغول خواهد نمود.