1

我已经在 J​​ohn Papa 的 CodeCamper SPA 中实现了分页。这样做时,我在使用 take() 和 skip() 函数时发现了一些奇怪的东西。

考虑以下用于跳过 2 条记录并取 2 条记录的 ODATA 查询:

/api/Breeze/Sessions?$orderby=TimeSlotId%2CLevel%2CSpeaker%2FFirstName&$skip=2&$top=2&$select=Id&$inlinecount=allpages

这将返回:

[{"$id":"1","$type":" IB _pMnaszsw5zIeP0Q7Dam12XmjGGg[[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade","Id":3},{"$id":"2", "$type":" IB _pMnaszsw5zIeP0Q7Dam12XmjGGg[[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade","Id":14}]

现在我跳过 4 条记录并取 2 条(好像移动到下一页)

/api/Breeze/Sessions?$orderby=TimeSlotId%2CLevel%2CSpeaker%2FFirstName&$skip=4&$top=2&$select=Id&$inlinecount=allpages

这将返回:

[{"$id":"1","$type":" IB _pMnaszsw5zIeP0Q7Dam12XmjGGg[[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade","Id":14},{"$id":"2", "$type":" IB _pMnaszsw5zIeP0Q7Dam12XmjGGg[[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade","Id":11}]

我两次获得 ID 14 的记录!我可以用任意数量的页面或记录重现此问题。

知道发生了什么吗?

[编辑]

好的,我注意到如果摆脱 orderby ($orderby=TimeSlotId%2CLevel%2CSpeaker%2FFirstName&) 那么一切都很好。orderby 怎么会出问题?

4

1 回答 1

0

为了使分页工作,应该有一个稳定的排序。我们[QueryableAttribute]通过尝试找出键是什么来做到这一点,如果它们还没有出现在查询中,则将它们添加到 order by 子句中。现在,推断实体的键是基于一些约定,例如实体是否具有名称为 Id 的属性或实体是否具有属性[KeyAttribute]等。

我怀疑我们无法找出Session你的IQueryable<Session>. 因此,没有强制执行稳定的排序顺序。现在它可能在没有 $orderby 的情况下工作的原因是表本身可能是有序的。同样,我猜你没有使用 entityframework,因为 entityframework 会抛出,如果有SkipTake没有 stable 排序orderby

EnsureStableOrdering现在,解决这个问题的方法(假设我之前的猜测是正确的:))是确保自己稳定排序并告诉 QueryableAttribute 通过设置来停止尝试进行稳定排序false

于 2013-04-08T16:11:52.467 回答