Controllers中的代码
[HttpGet(Name= nameof(GetDictionarys))] public async Task<ActionResult<DictionarysItemViewModel>> GetDictionarys(string ClassKey, [FromQuery]DictionaryParameters pars) { if (string.IsNullOrWhiteSpace(ClassKey) || !await dbc.DictionaryClasses.AnyAsync(a => a.Key == ClassKey)) { return NotFound("没有找到此字典分类"); } var items = dbc.Dictionarys.Where(a => a.ClassKey == ClassKey); //搜索 if (!string.IsNullOrWhiteSpace(pars.Q)) { pars.Q = pars.Q.Trim(); items = items.Where(a => a.Text.Contains(pars.Q)); } //排序 if (!string.IsNullOrWhiteSpace(pars.OrderBy)) { var orderByAfterSplit = pars.OrderBy.Split(","); foreach (var orderByClause in orderByAfterSplit.Reverse()) { var trimmedOrderByClause = orderByClause.Trim();//去除空格后的查询条件 var orderDescending = trimmedOrderByClause.EndsWith(" desc");//是否倒序 var indexOfFirstSpace = trimmedOrderByClause.IndexOf(" ", StringComparison.Ordinal); var propertyName = indexOfFirstSpace == -1 ? trimmedOrderByClause : trimmedOrderByClause.Remove(indexOfFirstSpace);//查询条件名称 var propertyMappingValue = ""; switch (propertyName.ToLower())//允许的搜索条件 { case "times":propertyMappingValue = "times"; break; case "key": propertyMappingValue = "Key"; break; case "text": propertyMappingValue = "Text"; break; default: propertyMappingValue = "Key"; break; } items = items.OrderBy(propertyMappingValue + (orderDescending ? " descending" : " ascending")); } } //分页 var pagelist = await PagedList<Dictionary>.CreateAsync(items, pars.PageNumber, pars.PageSize); var PrevPageLink = pagelist.HasPrevious ? Url.Link(nameof(GetDictionarys), new { PageNumber = pars.PageNumber - 1, pars.PageSize, pars.Q, pars.OrderBy }) : null; var NextPageLink = pagelist.HasNext ? Url.Link(nameof(GetDictionarys), new { PageNumber = pars.PageNumber + 1, pars.PageSize, pars.Q, pars.OrderBy }) : null; var paginationMetadata = new { pagelist.TotalCount, pagelist.PageSize, pagelist.CurrentPage, pagelist.TotalPages, PrevPageLink, NextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }));//向Header中添加分页信息 //输出结果 var r = pagelist.Select(a => new DictionarysItemViewModel() { Key = a.Key, Text = a.Text, times = a.times }).ToList(); return Ok(r); }
用来分页和查询数据的PagedList类
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 count, int pageNumber, int pageSize) { TotalCount = count; PageSize = pageSize; CurrentPage = pageNumber; TotalPages = (int)Math.Ceiling(count / (double)pageSize); AddRange(items); } public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source, int pageNumber, int pageSize) { var count = await source.CountAsync(); var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync(); return new PagedList<T>(items, count, pageNumber, pageSize); } }
//参数表
public class DictionaryParameters { private const int MaxPageSize = 100; public string Q { get; set; } public int PageNumber { get; set; } = 1; private int _pageSize = 20; public int PageSize { get => _pageSize; set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value; } public string OrderBy { get; set; } = "times desc"; }