【问题标题】:paging using the breezejs web api controller使用breathjs web api控制器进行分页
【发布时间】:2013-03-30 05:40:17
【问题描述】:

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

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

/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 怎么会出问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多