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

    //分頁
    items = items.Skip((pars.PageNumber - 1) * pars.PageSize).Take(pars.PageSize);
    var count = await items.CountAsync();
    var TotalPages = (int)Math.Ceiling(count / (double)pars.PageSize);
    var PrevPageLink = (pars.PageNumber > 1) ?
            Url.Link(nameof(GetDictionarys),
            new
            {
                PageNumber = pars.PageNumber - 1,
                pars.PageSize,
                pars.Q,
                pars.OrderBy
            }) :
            null;
    var NextPageLink = (pars.PageNumber < TotalPages) ?
        Url.Link(nameof(GetDictionarys),
        new
        {
            PageNumber = pars.PageNumber + 1,
            pars.PageSize,
            pars.Q,
            pars.OrderBy
        }) :
        null;

    var paginationMetadata = new
    {
        TotalCount=count,
        pars.PageSize,
        CurrentPage=pars.PageNumber,
        TotalPages,
        PrevPageLink,
        NextPageLink
    };
    Response.Headers.Add("X-Pagination",
        JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
        { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }));//向Header中添加分頁信息

    //輸出結果
    var r = items.Select(a => new DictionarysItemViewModel()
        {
            Key = a.Key,
            Text = a.Text,
            times = a.times
        }).ToList();

    return Ok(r);
}

 

//參數表

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM