带有 $count 的 OData v4 groupby

smo*_*nes 4 c# odata asp.net-web-api

我将 OData v4 与 WebAPI 与这些 nuget 包一起使用:

微软.Data.OData 5.7.0

Microsoft.AspNet.WebApi.OData 4.0.30506

我无法groupby与计数一起工作。这应该是最简单的事情。

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

SELECT e.status, count(*) AS total
FROM Delivery e
GROUP BY e.status
Run Code Online (Sandbox Code Playgroud)

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

/odata/deliveries?$apply=groupby((status),aggregate(status with countdistinct as total))
Run Code Online (Sandbox Code Playgroud)

它返回:

"value": [
{
    "@odata.id": null,
    "total": 1,
    "status": 1
},
{
    "@odata.id": null,
    "status": 2,
    "total": 1
},
{
    "@odata.id": null,
    "status": 4,
    "total": 1
}
]
Run Code Online (Sandbox Code Playgroud)

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

status  total
1       2
2       22
4       1
Run Code Online (Sandbox Code Playgroud)

我也读过有关 virtual property 的信息$count,但似乎 Microsoft尚不支持它

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

Chr*_*ler 6

虽然不支持 $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))
Run Code Online (Sandbox Code Playgroud)

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

SELECT status, COUNT(DISTINCT id) AS total
FROM Delivery
GROUP BY status
Run Code Online (Sandbox Code Playgroud)