通过


使用 OData 对行进行排序

$orderby使用查询选项指定返回项的顺序。 使用ascdesc后缀来分别指定升序或降序。 默认值为升序。 以下示例检索帐户的namerevenue属性,按revenue升序排列,name降序排列:

GET [Organization URI]/api/data/v9.2/accounts?$select=name,revenue
&$orderby=revenue asc,name desc
&$filter=revenue ne null

排序查找和选择列

大多数列类型都包含相对简单的数据,因此可以执行有意义的排序操作。 查找和选择列更为复杂,因为数据库中存储的数据在上下文中没有意义。

查找列

使用查阅列进行排序时,按相关表的主名称字段对结果进行排序。 数据库存储 GUID 值。 返回的格式化值是对应的主名称字段。

选择项列

使用选择列排序时,按所选的整数值对结果进行排序。

注释

此排序方法与 FetchXmlQueryExpression 排序选项值的方式不同。 在这些情况下,结果按所选的本地化标签进行排序。

若要使用 Dataverse Web API 按选择标签对结果进行排序,必须使用 FetchXml 来撰写查询。

排序和分页

对数据进行分页时,页面的排序方式会有很大的不同。 如果有关结果排序方式的信息不明确,则 Dataverse 无法一致或有效地返回分页数据。

指定查询的顺序。 使用 FetchXml 时,如果不向查询添加任何订单元素,Dataverse 会根据表的主键添加订单。 但是 QueryExpression 不,并且当查询指定 distinct 结果时,不会返回主键值,因此 Dataverse 无法添加此默认顺序。 必须指定分页顺序。 如果没有指定任何顺序, distinct 查询结果可能会按随机顺序返回。 OData 不提供返回唯一结果的任何选项,但在检索分页结果时仍应应用排序。

分页是动态的。 每个请求在收到时都会被独立评估。 分页 Cookie 会告知 Dataverse 上一页的位置。 借助此分页 Cookie 数据,Dataverse 可以从上一页最后一条记录之后的下一条记录开始。

分页功能在向前查询时效果最佳。 如果返回并检索之前检索的页面,则结果可能会有所不同,因为自上次检索页面以来,记录可以添加、删除或修改。 换句话说,如果页面大小为 50 并且返回,则会收到 50 条记录,但它们可能不相同 50 条记录。 如果继续向前浏览数据集的页面,则预期所有记录都以一致的顺序返回。

确定性排序非常重要

确定性排序 意味着有一种方法可以一致地计算订单。 对于给定的记录集,记录始终按相同的顺序返回。 若需保持排序与分页的一致性,必须包含某些唯一值或列值的组合,并指定其评估顺序。

非确定性示例

让我们看看一个 不确定的示例。 此数据集仅包含 状态状态 信息,并筛选为仅返回处于打开 状态的记录。 结果按 状态排序。 前三个页面将被请求。 结果如下所示:

地位 Page
打开 积极 1 开始
打开 积极 1
打开 积极 1 结束
打开 积极
打开 积极
打开 非活动
打开 非活动

分页 Cookie 会保存该页面最后一条记录的相关信息。 请求下一页时,不包括第一页中的最后一条记录。 但是,鉴于不确定的数据,不能保证第一页上的其他两条记录不包含在第二页上。

若要实现确定性排序,请对包含唯一值的列以及几乎唯一的值的列设置排序顺序。

确定性示例

此查询类似于 不确定的查询,但它包含包含唯一值的 Case ID 列。 它还按 状态排序,但也使用 事例 ID 进行排序。 结果如下所示:

地位 案例编号 Page
打开 积极 Case-0010 1 开始
打开 积极 Case-0021 1
打开 积极 Case-0032 1 结束
打开 积极 Case-0034
打开 积极 Case-0070
打开 非活动 Case-0015
打开 非活动 Case-0047

在下一页中,Cookie 将 Case-0032 作为第一页的最后一条记录存储,因此第二页将从该记录之后的下一条记录开始。 结果如下所示:

地位 案例编号 Page
打开 积极 Case-0010 1 开始
打开 积极 Case-0021 1
打开 积极 Case-0032 1 结束
打开 积极 Case-0034 2 启动
打开 积极 Case-0070 2
打开 非活动 Case-0015 2 结束
打开 非活动 Case-0047

由于此查询对唯一列值进行排序,因此顺序是一致的。

分页数据时的排序最佳实践

注释

如果可能,查询应对表的主键进行排序,因为默认情况下,Dataverse 已针对主键进行排序进行了优化。 按非唯一字段或复杂字段排序会导致过多开销和查询速度较慢。

检索在应用程序中显示的有限数据集时,或者需要返回超过 5,000 行的数据(对于弹性表为 500 行),则需要对结果进行分页。 在确定结果顺序时所做的选择可以确定检索到的每个数据页中的行是否与其他页面重叠。 如果没有正确的排序,同一条记录可以出现在多个页面中。

若要防止同一记录出现在多个页面中,请应用以下最佳做法:

最好包含具有唯一标识符的列。 例如:

  • 表主键列
  • 自动编号列
  • 用户/联系人 ID

如果不能包含具有唯一标识符的列,请包含多个最有可能导致唯一组合的字段。 例如:

  • 名字 + 姓氏 + 电子邮件地址
  • 全名 + 电子邮件地址
  • 电子邮件地址 + 公司名称

分页数据时的排序反模式

以下是要避免的排序选项:

  • 不包含唯一标识符的订单

  • 计算字段的排序

  • 包含单个或多个字段的排序,这些字段不太可能提供唯一性,例如:

    • 状态和状态
    • 选项或是非
    • 仅凭名称值。 例如namefirstnamelastname
    • 标题、说明和多行文本等文本字段
    • 非唯一数字字段

后续步骤

了解如何筛选行。