What is the difference between returning IQueryable<T> vs. IEnumerable<T>, when should one be preferred over the other?
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
Will both be deferred execution and when should one be preferred over the other?
Yes, both will give you deferred execution.
The difference is that
IQueryable<T>is the interface that allows LINQ-to-SQL (LINQ.-to-anything really) to work. So if you further refine your query on anIQueryable<T>, that query will be executed in the database, if possible.For the
IEnumerable<T>case, it will be LINQ-to-object, meaning that all objects matching the original query will have to be loaded into memory from the database.In code:
That code will execute SQL to only select gold customers. The following code, on the other hand, will execute the original query in the database, then filtering out the non-gold customers in the memory:
This is quite an important difference, and working on
IQueryable<T>can in many cases save you from returning too many rows from the database. Another prime example is doing paging: If you useTakeandSkiponIQueryable, you will only get the number of rows requested; doing that on anIEnumerable<T>will cause all of your rows to be loaded in memory.