1. 程式人生 > 其它 >開發隨筆記錄——EF資料分頁方法封裝以及使用。

開發隨筆記錄——EF資料分頁方法封裝以及使用。

宣告:本文章框架為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();
        }

此上就是整個過程的程式碼實現,如有程式碼不對,還請大神指定一二,萬分感謝。