如何在 Entity Framework Core 中应用 Keyset 分页

问题描述 投票:0回答:1

我写了这个分页代码:

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

这个实现总是返回相同的页面,我真的不明白为什么。

知道如何解决这个问题吗?

.net-core entity-framework-core pagination asp.net-core-webapi
1个回答
0
投票

键集分页不能与

page
值一起使用,就像您在第二个示例中所做的那样。您并没有真正在这里分页。偏移量和键设置是非常不同的分页方法。

  • 偏移分页使用页面值以及 Skip/Take 样式查询。

  • 键集分页需要形成由几列组成的所谓键集。该表根据键集进行排序,然后使用相同的键集形成一个 where 子句来查找所需的数据,最好使用索引。

键集分页更难实现,因为大多数 ORM 默认不支持它。它不是简单的 Skip/Take,而是需要不同的表达式,具体取决于您选择的键集。要使用 EFCore 实现键集分页的更简单方法,您可以检查我的包 MR.EntityFrameworkCore.KeysetPagination,如果您告诉它键集是什么,它将生成附加到 EFCore 查询的必要表达式。

有关偏移量和键集之间差异的更多信息,您可以查看MR.AspNetCore.Pagination,它为aspnetcore实现了偏移量和键集分页服务。

© www.soinside.com 2019 - 2024. All rights reserved.