- 参数传递(从URL到代码查询):参考解析URL中的批量信息中最后的方法
public class PaginationResourceParamaters
{
private int _pageNumber = 1;
public int PageNumber
{
get
{
return _pageNumber;
}
set
{
if (value >= 1)
{
_pageNumber = value;
}
}
}
private int _pageSize = 10;
const int maxPageSize = 50;
public int PageSize
{
get
{
return _pageSize;
}
set
{
if (value >= 1)
{
_pageSize = (value > maxPageSize) ? maxPageSize : value;
}
}
}
}
调用
private string GenerateTouristRouteResourceURL(TouristRouteResourceParamaters paramaters, PaginationResourceParamaters paramaters2,ResourceUriType type)
- 功能实现
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FakeXiecheng.API.Helper
{
public class PaginationList<T> : List<T>
{
public int TotalPages { get; private set; }
public int TotalCount { get; private set; }
public bool HasPrevious => CurrentPage > 1;
public bool HasNext => CurrentPage < TotalPages;
public int CurrentPage { get; set; }
public int PageSize { get; set; }
public PaginationList(int totalCount, int currentPage, int pageSize, List<T> items)
{
CurrentPage = currentPage;
PageSize = pageSize;
AddRange(items);
TotalCount = totalCount;
TotalPages = (int)Math.Ceiling(totalCount / (double)pageSize);
}
public static async Task<PaginationList<T>> CreateAsync( int currentPage, int pageSize, IQueryable<T> result)
{
var totalCount = await result.CountAsync();
// pagination
// skip
var skip = (currentPage - 1) * pageSize;
result = result.Skip(skip);
// 以pagesize为标准显示一定量的数据
result = result.Take(pageSize);
// include vs join
var items = await result.ToListAsync();
return new PaginationList<T>(totalCount, currentPage, pageSize, items);
}
}
}
- 用法:在仓储模式创建查询对象的时候(参考IQueryable中有关创建查询对象和执行查询的描述)将IQueryable
的查询对象和相关分页参数放进PaginationList .CreateAsync()方法中运行,并获取其结果(结果为已经执行了查询的结果,所以分页要放在查询的最后执行)
var touristRoutesFromRepo = await _touristRouteRepository.GetTouristRoutesAsync(paramaters.Keyword, paramaters.RatingOperator, paramaters.RatingValue, paramaters2.PageSize, paramaters2.PageNumber, paramaters.OrderBy );
public async Task<PaginationList<TouristRoute>> GetTouristRoutesAsync(string keyword, string ratingOperator, int? ratingValue, int pageSize, int pageNumber,string orderBy)
{
IQueryable<TouristRoute> result = _context.TouristRoutes.Include(t => t.TouristRoutePictures);
return await PaginationList<TouristRoute>.CreateAsync(pageNumber, pageSize, result);
}