odata v4是否支持日期值汇总?

问题描述

我正在寻找一种OData查询语法,该语法有助于解决我们在sqlServer中执行的Sum((DateDiff(minute,StartDate,EndDate))。是否可以使用OData v4进行此类操作?

我尝试了合计函数,但是不能在持续时间类型上使用sum运算符。有想法吗?

解决方法

您无法直接在符合标准的v4服务中执行类似的查询,因为内置的聚合都在单个字段上运行,例如,不支持创建新的任意列进行投影结果放入,这主要是因为新列未定义。通过将规范限制为仅在资源本身中预定义的列,我们可以对将返回的数据的结构具有高度的确定性。

如果您是API的作者,可以通过三种常用方法来实现与您的请求类似的查询。

  1. 定义一个Custom Data Aggregate,这比必要时要复杂得多,但这意味着您可以定义一次聚合,并在许多资源查询中使用它。

    • 仅当您确实需要在多个资源上重用同一聚合时才研究此解决方案
  2. 定义自定义 Function 来计算查询中所有或某些元素的结果。

    • 考虑 Function 类似于SQL View,它实际上只是表达与资源关联的自定义查询和自定义响应对象的一种方式。
    • 通常使用 Functions 来应用复杂的过滤条件,这些条件仍然会返回绑定的资源,但是如果需要,您可以返回完全不同的数据结构。
  3. 利用开放类型,这有时可能比您预期的要费力,但是如果您只想将少量通用转换应用于资源并将其结果投影为离散属性,则可以对其进行管理到标准资源定义。

    • 在您的情况下,您可以将DateDiff(minute,StartDate,EndDate)投影到其自己的离散列中,该列可能称为MinutesDuration。然后,您可以在这个新字段中$apply一个简单的SUM

公开自定义函数通常是最省力的方法,因为您完全不受结果形状的限制,可以与主要资源相对隔离地进行维护,就像使用开放类型一样,函数是有用的是调用者仍然可以将OData聚合应用于Function的结果。

如果原始帖子中更新了一些更详细的代码示例,则我可以详细介绍函数的实现,但是在这种状态下,我希望这些信息可以使您走上正确的道路。