Mixing IEnumerable and IQueryable
By Jérémie Chassaing on Wednesday, January 21, 2009, 17:12 - Domain Driven Design - Permalink
Marcel posted a comment in the previous post saying that even if returning IEnumerable, the new query clauses would be executed in the database… But it’s not.
If the repository use linq internally and returns the result as IEnumerable, on the other side, consider something like this :
var selectedEntities = repository.GetAll().Where(x => x.Selected)
Where GetAll returns an IEnumerable (that is actually a IQueryable).
The Where extension method will be selected on Enumerable. Be careful, Extension methods are static methods, no virtual call is involved here. The static type of the object decide the selected extension method.
Check in your debugger, selectedEntities is an instance of the Enumerable.WhereIterator internal class.
So when enumerating it, it enumerates its source and returns every item that passes the predicate.
When enumerating the source, here the source use linq2Sql to get the items and creates a query that returns all rows from the database.
The where clause was not executed in the database.
So the Linq provider did not leak outside of the repository.
Comments
Wow.. impressive.
I never thought of all that !!
Excellent information, not just for improving query performance, but as information on the inner workings of extension methods in general and the gotchas that can go along.