IEnumerator vs IQueryable

 

 

IEnumerable

Its Interface supports a simple iteration over a non-generic collection.

Best suitable for:

  • In-memory traversal
  • Querying data from in-memory collections like List, Array, etc.
  • local queries
  • for LINQ to Object and LINQ to XML queries. As long as you have something that implements IEnumerable<T>, you can use LINQ.

Traversal:

  • It is a forward only collection.

Returns:

  • A list that is the actual querying took place and you get the results. ToList is issued to force running the query and returning these enumerable results...

When to use:

  • Use IEnumerable/ToList if you want to return a list that has been retrieved from the Database.

Namespace:

  • System.Collection

Derives from:

  • No base interface

Processing Items:

  • IEnumerable can move forward only over a collection, it can’t move backward and between the items.

Moving Items:

  • Only supports moving to next item.

Searching:

  • It will process all records one by one in forward direction, will be done.

Filtering:

Indexing:

  • Indexing is provided by default.

How it works:

  • While query data from database, IEnumerable execute select query on server side, load data in-memory on client side and then filter data.

Performance:

  • Slower that IQueryable

When to use:

  • When querying data from in-memory collections like List, Array, etc.

Deferred Execution :

Custom Query:

Lazy Loading:

  • IEnumerable doesn’t support lazy loading. Hence not suitable for paging like scenarios.

Extension method:

  • Extension methods supports by IEnumerable takes functional objects.

Usage :

MyDataBaseContext dbC = new MyDataBaseContext ();
IEnumerable list = dbC.Employees.Where(p => p.Name.StartsWith("T"));
list = list.Take(10);

 

SQL Query:

 

SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0]
WHERE [t0].[EmpName] LIKE @p0
//@p0 represents 'T%'

 

Whatever IEnumerable can do, IQueryable can also do.

 

IQueryable

Provides functionality to evaluate queries against a specific data source wherein the type of the data is not specified.

IQueryable, which adds two key methods: CreateQuery<T> and Execute<T>. Both of these methods accept an Expression, which is basically a new set of classes that allow you to express things like method calls, operations, lambda functions, etc, as a tree of expressions.

By using IQueryable you can look inside of the LINQ query, and do things with the expression tree, perhaps so your operation now uses the index. The user now gets the benefit of the index, without even needing to know about it!

Whatever IEnumerable can do, IQueryable can also do.

Best suitable for:

  • To query data from out-memory
  • For remote data source - a database or web service (or remote queries)
  • Paging
  • IQueryable is suitable for LINQ to SQL queries, it has query provider (e.g., a LINQ to SQL provider)

Traversal:

  • Can traverse forward and backward in collection as well as between collection.
  • Query expression representing the IQueryable<T> object as a runtime-traversable expression that can be understood by the given query provider

Returns:

  • A "queryable" that is a query you could still be enriched before really sending it to the server.

When to use:

  • Use IQueryable if you want to return a base query that could be further enhanced before running it server side (by enumerating its items).

Namespace:

  • System.Linq

Derives from:

Processing Items:

  • IQueryable can move forward, backward and between the items.

Moving Items:

  • Can move items in collection.

Searching:

  • Perform faster search.

Filtering:

  • IQueryable execute select query on server side with all filters.

Indexing:

  • Support indexing by default.

How it works:

  • While query data from database, IQueryable execute select query on server side and filter data on server it self.

Performance:

When to use:

  • When querying data from out-memory (like remote database, service) collections.

Deferred Execution :

Custom Query:

  • IQueryable supports custom query using CreateQuery and Execute methods.

Lazy Loading:

  • IQueryable support lazy loading. Hence it is suitable for paging like scenarios.

Extension method:

  • Extension methods supports by IQueryable takes expression objects means expression tree.

Usage :

 


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

 

SQL Query:

 


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

 

Again - Whatever IEnumerable can do, IQueryable can also do.