مقایسه IEnumerable و IQueryable

مقدمه
در Query های LINQ برای دسترسی به داده های بانک اطلاعاتی یا مجموعه ها، از IQueryable و IEnumerable استفاده می شود. اینترفیس IQueryable اینترفیس IEnumerable را به ارث برده است. هر دو برای دسترسی به داده ها و کار با آنها مهم و پر کاربرد هستند. در ادامه امکانات هر دو و راهکارهای بالا بردن کارایی استفاده از هر کدام را بررسی می کنیم.

آشنایی با IEnumerable

  • IEnumerable در فضای نام System.Collections قرار دارد
  • در IEnumerable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IEnumerable بهترین انتخاب برای query گرفتن از داده های ذخیره شده در مجموعه های موجود در حافظه مانند List و Array است.
  • وقتی یک query روی بانک اطلاعاتی انجام می شود، IEnumerable ابتدا آن query را سمت Server اجرا کرده، داده ها را در سمت کلاینت در حافظه بارگذاری و سپس آنها را فیلتر می کند.
  • IEnumerable برای استفاده در query های Linq2Object و Linq2Xml مناسب است.
  • IEnumerable از امکان Deferred Execution پشتیبانی می کند (بدین معنی که query تا زمان اولین درخواست بصورت یک عبارت در حافظه نگهداری می شود)
  • IEnumerable از Custom Query ها پشتیبانی نمی کند.
  • IEnumerable از بارگذاری دیرهنگام (Lazy Loading) پشتیبانی نمی کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب نیست.


مثال از کاربرد IEnumerable:

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

عبارت SQL متناظر با مثال بالا برابر است با:

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

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

آشنایی با IQueryable

  • IQueryable در فضای نام System.Linq قرار دارد.
  • در IQueryable فقط می توان به سمت جلو حرکت کرد. نمی توان به سمت عقب یا بین آیتمها حرکت کرد.
  • IQueryable بهترین انتخاب برای کار با مجموعه های خارج از حافظه مانند بانکهای اطلاعاتی و سرویس هاست.
  • وقتی یک query روی یک بانک اطلاعاتی اجرا شود، IQueryable دستور select آن را به همراه همه فیلترها در سرور اجرا می کند.
  • IQeryable برای query های Linq 2 SQL مناسب است.
  • IQeryable از امکان Deferred Execution پشتیبانی می کند.
  • IQueryable از Custom Query ها با استفاده از متدهای CreateQuery و Execute پشتیبانی می کند.
  • IQueryable از بارگذاری دیرهنگام پشتیبانی می کند بنابراین برای سناریوهایی مانند صفحه بندی مناسب است.


مثال از کاربرد 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

منبع:

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *