我写了这个分页代码:
[HttpGet("{page}")]
public async Task<ActionResult<List<Request>>> GetRequest(int page)
{
var pageResults = 10f;
var pageCount = Math.Ceiling(_context.Request.Count() / pageResults);
var requests = await _context.Request
.OrderByDescending(x => x.RequestDate)
.Skip((page - 1) * (int)pageResults)
.Take((int)pageResults)
.ToListAsync();
var response = new RequestResponse
{
Requests = requests,
CurrentPage = page,
Pages = (int)pageCount
};
return Ok(response);
}
现在,根据微软的官方文档:Pagination,这是一个糟糕的实现,这个方法仍然会调用所有的数据,即使它们没有返回。随着用户在分页中进一步前进,超时将变得更长,因为必须调用更多数据。
如果您阅读文档,您会发现这个问题的解决方案相当简单,但是我不太明白我应该如何使用当前的实现来做到这一点。
我按照文档的建议尝试了以下操作:
[HttpGet("{page}")]
public async Task<ActionResult<List<Request>>> GetRequest(int page)
{
var pageResults = 10f;
// Added this variable
var lastDate = new DateTime(2020, 1, 1);
var pageCount = Math.Ceiling(_context.Request.Count() / pageResults);
var requests = await _context.Request
.OrderByDescending(x => x.RequestDate)
.Where(x => x.RequestDate > lastDate)
//.Skip((page - 1) * (int)pageResults)
.Take((int)pageResults)
.ToListAsync();
var response = new RequestResponse
{
Requests = requests,
CurrentPage = page,
Pages = (int)pageCount
};
return Ok(response);
}
这个实现总是返回相同的页面,我真的不明白为什么。
知道如何解决这个问题吗?
键集分页不能与
page
值一起使用,就像您在第二个示例中所做的那样。您并没有真正在这里分页。偏移量和键设置是非常不同的分页方法。
偏移分页使用页面值以及 Skip/Take 样式查询。
键集分页需要形成由几列组成的所谓键集。该表根据键集进行排序,然后使用相同的键集形成一个 where 子句来查找所需的数据,最好使用索引。
键集分页更难实现,因为大多数 ORM 默认不支持它。它不是简单的 Skip/Take,而是需要不同的表达式,具体取决于您选择的键集。要使用 EFCore 实现键集分页的更简单方法,您可以检查我的包 MR.EntityFrameworkCore.KeysetPagination,如果您告诉它键集是什么,它将生成附加到 EFCore 查询的必要表达式。
有关偏移量和键集之间差异的更多信息,您可以查看MR.AspNetCore.Pagination,它为aspnetcore实现了偏移量和键集分页服务。