دو عنصر بالا از شی ها یا به عبارتی نوع داده های (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  :
  1. MyDataContext db = new MyDataContext ();
  2. IEnumerable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
  3. list = list.Take<Employee>(10);
پرس و جوی تولید شده :
  1. SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
  2. WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن سمت کلاینت توسط شی موجود در حافظه کلاینت

IQueryable :
  1. MyDataContext db = new MyDataContext ();
  2. IQueryable<Employee> list = db.Employees.Where(p => p.Name.StartsWith("S"));
  3. list = list.Take<Employee>(10);
پرس و جوی تولید شده :
  1. SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
  2. WHERE [t0].[EmpName] LIKE @p0
توجه : اجرای پرس و جو سمت سرور (SQL SERVER) و فیلتر کردن آن در همان سمت