There are lots of libraries out there to use paging in enterprise applications. I personally would prefer to write my own as it’s customizable and easy to maintain and modify. Look at the following Generic class:
public class PagedResult<T> where T : class
{
public int CurrentPage { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; }
public int RowCount { get; set; }
public int FirstRowOnPage
{
get { return (CurrentPage - 1) * PageSize + 1; }
}
public int LastRowOnPage
{
get { return Math.Min(CurrentPage * PageSize, RowCount); }
}
public IList<T> Results { get; set; }
public PagedResult()
{
Results = new List<T>();
}
}
Now, in order to create an extension method for paging, consider the following one:
public static class PagingExtension
{
const int pageSize = 20;
public static PagedResult<T> GetPaged<T>(this IQueryable<T> query, int page) where T : class
{
var result = new PagedResult<T>
{
CurrentPage = page,
PageSize = pageSize,
RowCount = query.Count()
};
var pageCount = (double)result.RowCount / pageSize;
result.PageCount = (int)Math.Ceiling(pageCount);
var skip = (page - 1) * pageSize;
result.Results = query.Skip(skip).Take(pageSize).ToList();
return result;
}
}
That’s it, in order to use the above extension method:
public PagedResult<Coin> GetCoins(int page, bool active,int userId)
{
var activeExpression = GetActiveCoinExpression(active);
return _context.Set<Coin>()
.Include(x => x.UserFavouriteCoins.Where(x => x.UserId == userId))
.Where(activeExpression).GetPaged(page);
}
Forget about the extra codes of the above method but the using GetPaged(page) !