我一直在阅读 EFCore 团队的这篇文章 https://learn.microsoft.com/th-th/ef/core/querying/pagination 并尝试实现它。我面临的问题是这里显示的示例使用 INT 类型的主键。在下面给出的我的实体类中,主要是 GUID 类型
public sealed class Company{
public Guid Id { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public string? CreatedBy { get; set; }
public string Name { get; private set; } = null!;
public string Email { get; private set; } = null!;
public string? ContactNumber { get; private set; }
public string? Address { get; private set; }
public string QBAccount { get; private set; } = null!;
public string BoxFolderPath { get; private set; } = null!;
}
我尝试使用链接示例中给出的相同条件来实现此目的,即将Where()
子句中的pk与进行比较
var lastId = Guid.Parse("42ce0165-62b8-4ef6-f62f-08dadc0d2e5d");
var nextPage = context.Posts
.OrderBy(b => b.PostId)
.Where(b => b.PostId > lastId)
.Take(10)
.ToList();
但我没有得到预期的分页结果。请帮忙
我认为最好按另一个以有序方式代表您的数据的属性进行排序。我看到你有一个
CreatedOn
财产。当您按该属性排序时,您应该得到与按整数 ID 属性排序相同的结果。它可能会引入新的问题,你的
.Where
条款会有所不同。它可以更改为最后一个
CreatedOn
值,或者您可以创建一个子查询来检索
CreatedOn
记录的
lastId
值。
Guid
,您应该使用 EFCore 可以正确理解和翻译的
string.CompareTo
方法。像这样的东西应该有效:
var lastId = Guid.Parse("42ce0165-62b8-4ef6-f62f-08dadc0d2e5d");
var nextPage = context.Posts
.OrderBy(b => b.PostId)
// Flip between b.PostId and lastId depending on whether you want > or <
.Where(b => b.PostId.CompareTo(lastId))
.Take(10)
.ToList();
例如,我在 MR.EntityFrameworkCore.KeysetPagination 中执行此操作,这是一个简化在 EFCore 中使用键集分页的包。该链接包含我动态生成这些表达式的代码。