public static IQueryable<T> LimitAndOffset<T>(this IQueryable<T> q,
int pageSize, int pageOffset)
{
// while this Linq works on both Entity Framework and WCF Data Services...
// return q.Skip((pageOffset - 1) * pageSize).Take(pageSize);
// ...this Linq doesn't work on WCF Data Service
return q.Take(pageSize).Skip((pageOffset - 1) * pageSize);
}
I answered a colleague that Skip and Take's order doesn't matter (i.e. can call Take then Skip also) because it is deferredly executed, felt a little stupid for naturally assuming it applies to all Linq Providers :-) Linq for WCF Data Services doesn't allow Take then Skip. Don't assume anything when it comes to Linq.
Lesson learned, not all Linq providers are created equal. Lest I forgot, I already encountered one of many Linq's nuances a long time ago, example: http://www.ienablemuch.com/2010/12/performing-order-by-on-distinct-on-linq.html
I should have known better :-)
No comments:
Post a Comment