c# - 带有 $count 的 OData v4 groupby

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

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

Microsoft.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

我试过使用 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

我还阅读了有关虚拟属性(property)的信息 $count , 但它似乎是 Microsoft doesn't support it yet .

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

最佳答案

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

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

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

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

您的实际查询应该是对集合中每个项目唯一的属性进行 countdistinct,通常是一个 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

关于c# - 带有 $count 的 OData v4 groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41550860/

相关文章:

c# - 如何创建一个获取除特定值以外的所有内容的 linq 查询

c# - $http.delete 服务器请求不工作

asp.net-mvc - 包括 XML 注释 – Swashbuckle

.net - 二元运算符 LessThan 没有为类型 'System.Nullable` 1[System.DateTime ]' and ' System.Nullable`1[System.DateTimeOffset]' 定义

c# - 删除单个集合中的重复项 C#

c# - Winforms 主 UI 线程主体恢复到以前的状态

iphone - odatagen : Failed to generate proxy classes. 请验证元数据(iOS)

asp.net-web-api - 如何将 OData 过滤器转换为 LINQ 表达式?

c# - 电脑休眠后​​ MediaPlayer 不播放

c# - NuGet 库匿名发布