OData v4 groupby with $ count

时间:2017-01-09 15:03:32

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

我使用带有这些nuget-packages的WebAPI的OData v4:

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

如何将group by与带有OData v4的简单count一起使用?

2 个答案:

答案 0 :(得分:2)

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

所以事实证明你的查询中有一个简单的错误!

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

您要求计算状态的所有不同值。由于您按状态分组,因此每个组中的不同值始终为1:)

您的实际查询应该是对一个属性进行计数,该属性对于集合中的每个项目都是唯一的,通常是Id。假设交付有一个名为“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

答案 1 :(得分:0)

当前在ODATA v4中,它满足您的要求

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

上面的代码翻译为以下内容

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