開發隨筆記錄——EF資料分頁方法封裝以及使用。
阿新 • • 發佈:2021-08-11
宣告:本文章框架為ASP.NET Core 3.1
首先構建一個用來獲取前端資訊的儲存類(若要進行過濾、搜尋等功能,可在該儲存類中新增相應屬性),如下程式碼:
/// <summary> /// PageNumber預設為1,PageSize預設為10 /// </summary> public class AuthorResourceParmeters { public const int MaxPageSize = 50; private int _pageSize = 10; public int PageNumber { get; set; } = 1; public int PageSize { get { return _pageSize; } set { _pageSize = (value > MaxPageSize) ? MaxPageSize : value; } } }
其次在構建一個儲存分頁集合的方法並整合集合類(裡面包含各個引數、建構函式、靜態方法),如下程式碼:
/// <summary> /// 構建分頁集合 /// </summary> /// <typeparam name="T"></typeparam>public class PagedList<T> : List<T> { /// <summary> /// 當前頁 /// </summary> public int CurrentPage { get; private set; } /// <summary> /// 總頁數 /// </summary> public int TotalPages { get; private set; }/// <summary> /// 每頁數量 /// </summary> public int PageSize { get; private set; } /// <summary> /// 總數量 /// </summary> public int TotalCount { get; private set; } /// <summary> /// 是否有上一頁 /// </summary> public bool HasPrevious => CurrentPage > 1; /// <summary> /// 是否有下一頁 /// </summary> public bool HasNext => CurrentPage < TotalPages; public PagedList(List<T> items,int totalCount,int pageNumber,int pageSize) { TotalCount = totalCount; CurrentPage = pageNumber; PageSize = pageSize; TotalPages = (int)Math.Ceiling((double)totalCount / pageSize); AddRange(items); } public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source,int pageNumber,int pageSize) { var totalCount = source.Count(); var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList(); var List = new PagedList<T>(items, totalCount, pageNumber, pageSize); return await Task.FromResult(List); } }
以上兩步完成後就可以進行使用階段了,首先建立測試方法的介面,如下:
Task<PagedList<TestModel>> GetAllAsync(AuthorResourceParmeters parmeters);
接下來進行介面方法的實現,如下程式碼:
public Task<PagedList<TestModel>> GetAllAsync(AuthorResourceParmeters parmeters) { IQueryable<TestModel> queryableTestModel = DbContext.Set<TestModel>(); //若過濾、搜尋等欄位不為空,再次可對相關屬性進行檢索,如queryTestModel.Where() return PagedList<TestModel>.CreateAsync(queryableTestModel, parmeters.PageNumber, parmeters.PageSize); }
最後就可以在控制器中進行該方法的使用了,如下程式碼:
[HttpGet("testPageList",Name = nameof(GetTestModelsAsync))] public async Task<ActionResult<IEnumerable<TestModelDto>>> GetTestModelAsync([FromQuery] AuthorResourceParmeters parmeters) { var pageList = await _repositoryWrapper.TestModel.GetAllAsync(parmeters); var paginationMetadata = new { totalCount = pageList.TotalCount, pageSize = pageList.PageSize, currentPage =pageList.CurrentPage, totalPages = pageList.TotalPages, previousePageLink = pageList.HasPrevious ? Url.Link(nameof(GetTestModels),new { pageNumber = pageList.CurrentPage -1 , pageSize = pageList.PageSize }) : null , nextPageLink = pageList.HasNext ? Url.Link(nameof(GetTestModels),new { pageNumber = pageList.CurrentPage + 1, pageSize = pageList.PageSize }) : null }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var testModelDto = _mapper.Map<IEnumerable<TestModelDto>>(pageList); return testModelDto.ToList(); }
此上就是整個過程的程式碼實現,如有程式碼不對,還請大神指定一二,萬分感謝。