ASP.NET Core 3.1 Web API GET方法。(支持查询、排序、分页)

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";
}

猜你喜欢

转载自www.cnblogs.com/ANPY/p/12431892.html
今日推荐