使用breezejs web api控制器进行分页

时间:2013-04-08 07:57:49

标签: asp.net-web-api odata breeze single-page-application

我在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&)那么一切都很好。命令如何导致问题?

1 个答案:

答案 0 :(得分:0)

要使分页工作,应该有一个稳定的排序。我们使用[QueryableAttribute]执行此操作,尝试找出密钥是什么,并将它们添加到order by子句中(如果它们尚未出现在查询中)。现在,基于一些约定来推断实体的密钥是基于尽力而为的,例如,如果实体具有名称为Id的属性,或者实体具有[KeyAttribute]等的属性,则

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

现在,修复此问题的方法(假设我之前的猜测是正确的:))是为了确保自己的稳定排序并告诉QueryableAttribute通过将EnsureStableOrdering设置为{{1}来停止尝试进行稳定排序}}