When we call a query operator on a sequence, a sequence-specific operator gets called.
I mean if i call Where<>() operator on IEnumerable<>, the operator that will be called will be defined in Enumerable class and if it’s called on IQueryable<>, the one defined in Queryable class will be called.
Consider the operator Reverse, defined in the Enumerable class.
If i want to call it on Iqueryable<> then I must use the AsEnumerable<>() operator to first convert it into IEnumerable<>.
db.Countries.OrderBy(cntry=>cntry.CountryName).AsEnumerable().Reverse()
But the Reverse operator got to have all records at the same time so that it can reverse them.
In the above code do all the records get loaded in memory first and then the Reverse() operator is reversing it ?
IQueryable<T>extendsIEnumerable<T>, so the AsEnumerable is redundant. However, if you use it, AsEnumerable is not going to greedily load the collection (that would be a very annoying “feature”). Clearly, Reverse will need the whole thing. Mono implements Enumerable.Reverse using aList<T>and a simple iterator-generator that yields in reverse.I believe the only real purpose of AsEnumerable is to force the use of IEnumerable explicit interface implementations.