【问题标题】:Custom orderBy with odata?使用 odata 自定义 orderBy?
【发布时间】:2016-03-08 06:49:37
【问题描述】:

在 AngularApp 中,我通过 OData 查询从 WebAPI 获取数据。

所有结果都有一个日期和一个 int 状态码。状态码可以是 1、2、3 或 4。

我想对我的结果进行排序,因此所有状态码为 1 的结果都位于列表顶部。代码 2、3 和 4 的其余结果按附加到它们的数据排序,而不是状态码。

可能吗?

这是我现在的代码。它只是按日期排序,没有别的。

return Products.query({ $orderby: 'Date' });

【问题讨论】:

  • 您可以控制 OData 服务吗?换句话说,您可以向服务添加新行为吗?
  • 是的,我可以改变它。你在想什么?
  • 您不能将任意排序函数传递给$orderby。无论如何,IMO 最好定义一个 OData function 来执行排序,而不是要求客户端提供一个复杂的 $orderby 子句。对绑定到 Products 实体集的函数的请求看起来像 GET http://host/Products/ServiceNamespace.CustomOrderBy
  • 我在下面为您提供了一个客户端解决方案。

标签: javascript angularjs odata


【解决方案1】:

根据您的描述,您似乎希望平等对待所有 StatusCode 为 1 的产品。也就是说,它们不会按Date 进一步排序。如果你可以稍微放宽这个要求,让所有产品都按照StatusCodeDate排序,有一个直截了当的解决方案:

return Products.query({ $orderby: 'StatusCode,Date' });

OData v4 中的$orderby query option 包含“一个逗号分隔的表达式列表,其原始结果值用于对项目进行排序”。属性名称是用于生成排序值的最常用表达式。

如果您想反转特定属性的排序,请在该属性上使用 desc 后缀,如下所示:

return Products.query({ $orderby: 'StatusCode,Date desc' });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2012-10-05
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多