我在John Papa的伟大CodeCamper SPA中实现了分页功能。在这样做时,我在使用take()和skip()函数时发现了一些奇怪的东西。
考虑以下ODATA查询以跳过2条记录并取2:
?/ API /微风/会话$的OrderBy = TimeSlotId%2CLevel%2CSpeaker%2FFirstName&安培; $跳过= 2及$顶部= 2及$选择=编号&安培; $ inlinecount =所有页
返回:
[{ “$ ID”: “1”, “$类型”:“ IB _pMnaszsw5zIeP0Q7Dam12XmjGGg [[System.Int32, mscorlib程序], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade “ ”ID“:3},{ ”$ ID“: ”2“, ”$类型“:” IB _pMnaszsw5zIeP0Q7Dam12XmjGGg [[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade“,”Id“:14}]
现在我跳过4条记录并取2条(好像转到下一页)
?/ API /微风/会话$的OrderBy = TimeSlotId%2CLevel%2CSpeaker%2FFirstName&安培; $跳过= 4和; $顶部= 2及$选择=编号&安培; $ inlinecount =所有页
返回:
[{ “$ ID”: “1”, “$类型”:“ IB _pMnaszsw5zIeP0Q7Dam12XmjGGg [[System.Int32, mscorlib程序], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade “ ”标识“:14},{ ”$ ID“: ”2“, ”$类型“:” IB _pMnaszsw5zIeP0Q7Dam12XmjGGg [[System.Int32, mscorlib]], IB _pMnaszsw5zIeP0Q7Dam12XmjGGg_IdeaBlade“,”Id“:11}]
我两次获得Id 14的记录!我可以使用任意数量的页面或记录重现此问题。
知道发生了什么事吗?
[编辑]
好的,我注意到如果摆脱了orderby($ orderby = TimeSlotId%2CLevel%2CSpeaker%2FFirstName&)那么一切都很好。命令如何导致问题?
答案 0 :(得分:0)
要使分页工作,应该有一个稳定的排序。我们使用[QueryableAttribute]
执行此操作,尝试找出密钥是什么,并将它们添加到order by子句中(如果它们尚未出现在查询中)。现在,基于一些约定来推断实体的密钥是基于尽力而为的,例如,如果实体具有名称为Id的属性,或者实体具有[KeyAttribute]
等的属性,则
我怀疑我们无法为Session
找出IQueryable<Session>
的关键属性。因此,没有强制执行稳定的排序顺序。现在它可能在没有$ orderby的情况下工作的原因是表本身可能是有序的。同样,我猜你没有使用entityframework,因为如果Skip
或Take
没有稳定的排序orderby
,实体框架会抛出。
现在,修复此问题的方法(假设我之前的猜测是正确的:))是为了确保自己的稳定排序并告诉QueryableAttribute通过将EnsureStableOrdering
设置为{{1}来停止尝试进行稳定排序}}