在Asp .net core 中不依赖插件实现分页
由于c#有强大的linq特性以及支持方法扩展,我们不需要什么第三方插件就能自己实现分页功能
-
为了程序的可扩展性,分页参数可能会发生变化,不妨将分页参数如下封装起来

public class PaginationResourceParameters { private const int MAXPAGESIZE = 50; private int _pageNumber = 1; public int PageNumber { get { return _pageNumber; } set { if (value >= 1) { _pageNumber = value; } } } private int _pageSize = 10; public int PageSize { get { return _pageSize; } set { if (value >= 1) { _pageSize = (value > MAXPAGESIZE) ? MAXPAGESIZE : value; } } } } -
在控制器的Action中传入分页参数

-
调用repository时传入分页参数
-
创建一个分页helper

public class PaginationList: List { public int TotalPages { get; private set; } public int TotalCount { get; private set; } public int CurrentPage { get; set; } public bool HasPrevious => CurrentPage > 1; public bool HasNext => CurrentPage < TotalPages; public int PageSize { get; set; } public PaginationList(int totalcount, int currentPage, int pageSize, List items) { CurrentPage = currentPage; PageSize = pageSize; TotalCount = totalcount; TotalPages = (int)Math.Ceiling(totalcount / (double)pageSize); AddRange(items); } public static async Task > CreateAsync( int currentPage, int pageSize, IQueryable result) { var totalCount = await result.CountAsync(); var skip = (currentPage - 1) * pageSize; result = result.Skip(skip); result = result.Take(pageSize); var items = await result.ToListAsync(); return new PaginationList (totalCount, currentPage, pageSize, items); } } -
在repository中调用PaginationList实现分页
return await PaginationList.CreateAsync(pageNumber, pageSize, res);