Ef core 7 中的按键集分页

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

我一直在阅读 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();
但我没有得到预期的分页结果。请帮忙

.net asp.net-core entity-framework-core pagination keyset-pagination
2个回答
0
投票
您通过 Guid 进行排序,默认情况下,Guid 不是连续的。有多种方法可以生成顺序指南,但我不确定这是否会以可靠的方式修复您的排序。

我认为最好按另一个以有序方式代表您的数据的属性进行排序。我看到你有一个

CreatedOn

 财产。当您按该属性排序时,您应该得到与按整数 ID 属性排序相同的结果。

它可能会引入新的问题,你的

.Where

条款会有所不同。它可以更改为最后一个 
CreatedOn
 值,或者您可以创建一个子查询来检索 
CreatedOn
 记录的 
lastId
 值。


0
投票
对于

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 中使用键集分页的包。该链接包含我动态生成这些表达式的代码。

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