【问题标题】:OData v4 groupby with $countOData v4 groupby 与 $count
【发布时间】:2017-05-23 21:09:54
【问题描述】:

我正在使用带有 WebAPI 的 OData v4 和这些 nuget 包:

Microsoft.Data.OData 5.7.0

Microsoft.AspNet.WebApi.OData 4.0.30506

我无法让 groupby 与 count 一起工作。应该是最简单的吧。

我有一个名为Delivery 的简单表/实体。它有一个状态列(在其他几个列中)。我基本上想做的是这个 SQL 查询,但是使用 OData:

SELECT e.status, count(*) AS total
FROM Delivery e
GROUP BY e.status

我试过使用countdistinct,但它没有给我正确的结果。

/odata/deliveries?$apply=groupby((status),aggregate(status with countdistinct as total))

返回:

"value": [
{
    "@odata.id": null,
    "total": 1,
    "status": 1
},
{
    "@odata.id": null,
    "status": 2,
    "total": 1
},
{
    "@odata.id": null,
    "status": 4,
    "total": 1
}
]

正确的结果应该是(这是我的 SQL 查询返回的):

status  total
1       2
2       22
4       1

我也读过关于虚拟财产$count,但它似乎是微软doesn't support it yet

如何在 OData v4 中使用 group by 和简单的 count

【问题讨论】:

  • 看起来可能还不支持:github.com/OData/WebApi/issues/773
  • @TomDoesCode,是的。我的问题中有相同​​的链接,但我希望可以通过其他方式完成。
  • 哦,是的,我现在看到了,对不起! (我责怪我的屏幕颜色不正确,没有发现链接)
  • @TomDoesCode,没有问题。 :) 我很感激任何线索和我能得到的任何帮助。
  • 一种解决方案是使用来自AdaptiveLINQ 组件的LINQ 扩展方法QueryByCube。 (免责声明:我是 AdaptiveLINQ 开发者)。

标签: c# asp.net-web-api odata


【解决方案1】:

虽然不支持 $count,但 contdistinct 已经支持了一段时间,并且对于 OData 聚合场景可能在语法上更正确,文档有点缺乏,但 countdistinct 让调用者可以控制在结果集中使用哪个字段来确定独特的结果。这在复杂的嵌套或扩展分组查询中特别有用。

原来你的查询中有一个简单的错误!

在您的查询中: /odata/deliveries?$apply=groupby((status),aggregate(status with countdistinct as total))

您要求计算所有不同状态值。因为您是按状态分组的,所以每组中的不同值将始终为 1 :)

您的实际查询应该是对集合中每个项目唯一的属性进行计数,通常是一个 ID。假设 Delivery 有一个名为“Id”的 Id 字段,您的查询应该是这样的:

/odata/deliveries?$apply=groupby((status),aggregate(id with countdistinct as total))

这将与您预期的 SQL 密切相关:

SELECT status, COUNT(DISTINCT id) AS total
FROM Delivery
GROUP BY status

【讨论】:

  • 可以对odata的结果应用任何过滤器或组吗?说,我只想选择总数为2的人。这可能吗?
  • 您可以通过在查询中附加&$filter=total eq 2 来按结果分组$filter,但这不太有用,它不会返回所有满足条件的项目,只会返回满足条件的组。跨度>
【解决方案2】:

目前在 ODATA v4 中,它支持您的要求

/Entity/$apply=groupby((status),aggregate($count as COUNT))

上面的代码翻译成下面的

select status, count(*) from  entity group by status;

【讨论】:

  • 根据标准,这应该可以工作......但微软的实施被打破了,没有这样做......仍然!在您发布此内容将近一年后:(
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多