آشنایی با اینترفیس های IEnumerable و IQuerable

در این مقاله قصد دارم توضیحی درباره تفاوت اینترفیس های IEnumerable و IQuerableبه شما دوستان بدهم IEnumerable و IQuerable هر دو نوعی اینترفیس در مجموعه های .Netهستند.

 IEnumerable و IQuerable هر دو نوعی اینترفیس   در مجموعه های .Net هستند اینترفیس IQuerable، از اینترفیس IEnumerable  ارث بری کرده است  به عبارت دیگر هر کاری که اینترفیس IEnumerable  انجام میدهد این اینترفیس نیز انجام میدهد پس سوال اصلی اینجاست که فرق بین این دو اینترفیس چیست و چرا مایکروسافت به فکر ایجاد اینترفیس IQuerable افتاد

حال اکنون میپردازیم به تفاوت این دو رابط کاربری یا همان اینترفیس

آشنایی با IEnumerable

  :IEnumerableدر فضای نام System.Collections قرار دارد

  در IEnumerable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.

  IEnumerable بهترین انتخاب برای query گرفتن از داده های ذخیره شده در مجموعه های موجود در حافظه مانند List و Array است.

وقتی یک query روی بانک اطلاعاتی انجام می شود، IEnumerable ابتدا آن query را سمت Server اجرا کرده، داده ها را در سمت کلاینت در حافظه بارگذاری و سپس آنها را فیلتر می کند

:  Enumerable از Custom Query ها پشتیبانی نمی کند.

  IEnumerable از بارگذاری دیرهنگام (Lazy Loading) پشتیبانی نمی کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب نیست.

برای استفاده از IEnumerable ها میتوان از متدد GetEnumerator استفاده کرد  و  داده های خود را با استفاده از حلقه foreach تکرار کرد

 

MyDataContext dc = new MyDataContext ();
IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10);

عبارت تولید شده در Sql

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0

این نکته را یاد اوری کنم که عمل فیلتر کردن (10 آیتم آخر) در سمت کاربرانجام می شود و معادل آن SQL تولید نشده است.

آشنایی با IQueryable:

IQueryable در فضای نام System.Linq قرار دارد.

در IQueryable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد

IQueryable بهترین انتخاب برای کار با مجموعه های خارج از حافظه مانند بانکهای اطلاعاتی و سرویس هاست.

وقتی یک query روی یک بانک اطلاعاتی اجرا شود، IQueryable دستور select آن را به همراه همه فیلترها در سرور اجرا می کند

IQueryable از Custom Query ها با استفاده از متدهای CreateQuery و Execute پشتیبانی می کند.

IQueryable از بارگذاری دیرهنگام پشتیبانی می کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب است

•	MyDataContext dc = new MyDataContext ();
•	IQueryable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
•	list = list.Take<Employee>(10);

عبارت تولید شده در Sql

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary]
FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0