首页 > 解决方案 > C# 获取请求标头并返回实体的排序列表

问题描述

再次发布,因为我无法访问我的初始堆栈溢出帐户。最初的问题张贴在这里。对于造成的任何不便,我提前道歉。

如何读取请求标头?我想查找并阅读一个键,说“排序”,如果它是真的,我会返回所有书籍/实体的排序版本。我也不确定如何返回已排序的实体。我知道这看起来很奇怪,但它是我的分配规范的一部分,否则我会使用该[FromRoute]属性从 URL 中获取一个参数。似乎对我不起作用。是另一个不起作用的老问题,因为我无法将请求标头键与字符串或空值进行比较。这是我当前的代码:

// GET: api/Books
[HttpGet]
public async Task<ActionResult<IEnumerable<Book>>> GetAllBooks()
{
    if (Request.Headers["sorted"] == true)
    {


    }
    return await _context.Books.ToListAsync();
}

public class Book
{
    [Key]
    public long id { get; set; }
    public long libraryId { get; set; }
    public string title { get; set; }
    public string author { get; set; }
    public string description { get; set; }
}

编辑:添加书籍实体

标签: c#asp.net-corehttp-headers

解决方案


你可以像这样实现它:

if (Request.Headers.TryGetValue("sorted", out StringValues sortedValue) 
    && bool.TryParse(sortedValue, out bool isSorted))
{
     if(isSorted)
     {
          return await _context.Books.OrderByDescending(a => a.Id).ToListAsync();
     }
}

return await _context.Books.OrderBy(a => a.Id).ToListAsync();

TryGetValue您要编写and的原因TryParse是要避免exceptions该值是missing/null或该值不是 a boolean

并根据您的逻辑,您可以ascending or descending按您想要的顺序对书籍进行排序,property例如:ID、标题、作者或发布日期 ...等。

或者为简单起见,您可以将检查更改为:


if (bool.TryParse(Request.Headers["sorted"], out bool isSorted) && isSorted){
     return await _context.Books.OrderByDescending(a => a.Id).ToListAsync();
}

return await _context.Books.OrderBy(a => a.Id).ToListAsync();

编辑(添加邮递员请求示例):

在此处输入图像描述


推荐阅读