OBSOLETE… sort of. Found an issue with this and am posting the issue today. (07/21/2009)
A while back I decided to show some paging stuff and I forgot that recently, well ok in the last few months, I actually put together a sort of generic extension method to take care of most of the paging situations I was running into. Reason being is I got tired of writing the same method over and over. I figured I’d share it in hopes that somehow, somewhere, it would keep someone’s dream alive. That and I figured I needed to make up for not posting for a while… which to some of you might have been a good thing.
Anywho, it’s not to difficult actually. Small note though, when reading the code you will see the TotalCountOfPages method and the GetRealPage method. If you can’t figure out what those are then I just don’t know what to do. (HINT: They are linked somewhere in this very post! Side note: This post is on track to match the normal self linking per post quota on atypical Codding Horror post)
public static IList<K> GetListForGrid<T, K> ( this ObjectQuery<T> query, //Extension method syntax... basically takes in any SomeEntities.SomeTableRepresentation Expression<Func<T, Boolean>> somethingEqualsSomething, //Where clause Expression<Func<T, K>> selectClause, Expression<Func<K, IComparable>> orderBy, //Turns out order by just needs anything that is IComparable Int32 pageNumber, Int32 numberToShow, out Int32 realPage, out Int32 totalCountOfPages ) { IList<K> returnValue; //Get the total count of the items. Need this to do proper paging. Int32 totalItemCount = query .Count ( somethingEqualsSomething ); totalCountOfPages = TotalCountOfPages(totalItemCount, numberToShow); realPage = GetRealPage(totalCountOfPages, pageNumber); returnValue = query .Where ( somethingEqualsSomething ) .Select ( selectClause ) .OrderBy(orderBy) .Skip(numberToShow * realPage) .Take(numberToShow) .ToList(); return returnValue; }
As you can see there are a lot of expressions going on and that’s the way this works. It takes care of the annoying stuff that you would have to copy an paste while you supply it the stuff that changes like what you want to select and what the needed items have to match to be selected. Even has something for an order by. What the usage look like?
ToolEntities.Tools.GetListForGrid ( something => something.SomethingId == passedInSomethingId, //Where clause found => found, //Select: Simple here. Usually I use classes to hold info... next post found => found.Name, //Order by pageNumber, amountToShow, out realPage, out totalCountOfPages );
Really simple, eh?
Why totalCountOfPages and RealPage out? Well the whole idea is that this infomation is valuable to the picker control you will be constructing outside this method call. RealPage is nice for showing what page the pager is on and how to figure out what the previous and next pages will be. TotalCountOfPages is useful for the last page possible. Now the nice thing about the RealPage method is that it won’t give you a non existent page. It will only give you the best possible page if the pageNumber parameter is over the possible amount of pages.
Also do notice that this is an extention method meant to be used with the Entity Framework’s built in system of handling the Table representations say ToolEntities.Tools.(Method will show up here in intellisense). This makes it cleaner to me than having to pass in the actual current context. As in:
GetListForGrid(ToolEntities.Something, …) vs ToolEntites.Something.GetListForGrid(…)
In the end, either way is fine.