دو عنصر بالا از شی ها یا به عبارتی نوع داده های (Data Type) دات نت هستند؛ ما از IEnumerable و IQueryable برای دستکاری داده استفاده می کنیم (LINQ). در دات نت IEnumerable توسط IQueryable به ارث برده می شود به عبارتی دیگر IQueryable همه ویژگی های IEnumerable دارد و علاوه بر آن ها ویژگی های منحصر به فرد خود را نیز دار؛ هر دوی این دو شی برای بازیابی و دستکاری داده های موجود در پایگاه داده (Database) به کار می روند. اجازه دهید ویژگی های هر کدام و برتری آنها نسبت به هم را نام ببرم؛ که نقش مهمی در بالا بردن سرعت و کارایی پرس و جوهای (LINQ) دارند.
دو عنصر بالا شباهت زیادی به هم دارند و همه برنامه نویسان از هر دو آنها استفاده می کنند ولی از لحاض کارایی در سناریوهای مختلف متفاوت عمل می کنند.
IEnumerable :
- فضای نام (System.Collections)
- بهترین مورد استفاده آن در بازیابی داده از شی های موجود در حافظه (in-Memory Objects) مانند لیست، آرایه و ... است
- موقعی که بازیابی داده از پایگاه داده انجام می شود IEnumerable پرس و جو را سمت سرور اجرا کرده و داده ها را در شی های in-Memory در سمت کلاینت بارگذاری کرده و بعد عمل فیلترینگ را انجام می دهد
- بهترین و مناسب ترین برای پرس و جوهای LINQ to Object و LINQ to XML
- پشتیبانی از (deferred execution)
- عدم پشتیبانی از پرس و جوهای سفارشی (custom query)
- عدم پشتیبانی از (lazy loading) و نامناسب برای صفحه بندی (paging)
IQueryable :
- فضای نام (System.Linq)
- بهترین مورد استفاده آن در بازیابی داده از شی های موجود در خارج حافظه (out-Memory Objects) مانند پایگاه داده ها، سرویس ها و ... است
- موقعی که بازیابی داده از پایگاه داده انجام می شود IQueryable پرس و جو را سمت سرور با انجام عمل فیلترینگ اجرا می کند
- بهترین و مناسب ترین برای پرس و جوهای LINQ to SQL
- پشتیبانی از (deferred execution)
- پشتیبانی از پرس و جوهای سفارشی (custom query) با استفاده از CreateQuery و Execute methods.
- پشتیبانی از (lazy loading) و مناسب برای صفحه بندی (paging)
مثال :
IEnumerable :
- MyDataContext db = new MyDataContext ();
- IEnumerable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
- list = list.Take<Employee>(10);
پرس و جوی تولید شده :
- SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
- WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن سمت کلاینت توسط شی موجود در حافظه کلاینت
IQueryable :
- MyDataContext db = new MyDataContext ();
- IQueryable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
- list = list.Take<Employee>(10);
پرس و جوی تولید شده :
- SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
- WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن در همان سمت