我使用带有这些nuget-packages的WebAPI的OData v4:
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
一起使用?
答案 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;