C# 带$count的OData v4 groupby
我将OData v4与WebAPI一起用于以下nuget软件包: 我无法让C# 带$count的OData v4 groupby,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我将OData v4与WebAPI一起用于以下nuget软件包: 我无法让groupby与count一起工作。这应该是最简单的事情 我有一个名为Delivery的简单表/实体。它有一个状态列(在其他几个列中)。我基本上想做的是这个SQL查询,但是使用OData: SELECT e.status, count(*) AS total FROM Delivery e GROUP BY e.status 我试过使用,但没有给出正确的结果 /odata/deliveries?$apply=grou
groupby
与count一起工作。这应该是最简单的事情
我有一个名为Delivery
的简单表/实体。它有一个状态列(在其他几个列中)。我基本上想做的是这个SQL查询,但是使用OData:
SELECT e.status, count(*) AS total
FROM Delivery e
GROUP BY e.status
我试过使用,但没有给出正确的结果
/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查询返回的结果):
我也读过关于虚拟财产的书,但它似乎是微软的
如何在OData v4中使用
分组依据
和简单的计数
?虽然$count不受支持,但contdistinct已经支持了一段时间,对于OData聚合场景可能在语法上更正确,文档有点缺乏,但是countdistinct让调用方控制在结果集中使用哪个字段来确定唯一的结果。这在复杂的嵌套或扩展分组查询中特别有用
因此,事实证明您的查询中有一个简单的bug
在您的查询中:
/odata/deliveries?$apply=groupby((状态),aggregate(状态,countdistinct为total))
您要求计算所有不同的状态值。因为您是按状态分组的,所以每个组中的不同值始终为1:)
您的实际查询应该是countdistinct,该属性对于集合中的每个项目都是唯一的,通常是一个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
目前在ODataV4中,它支持您的需求
/Entity/$apply=groupby((status),aggregate($count as COUNT))
上面的代码转换为以下内容
select status, count(*) from entity group by status;
看起来这可能还不受支持:@TomDoesCode,是的。我在我的问题中有相同的链接,但我希望它可以以其他方式完成。哦,是的,我现在看到了,对不起!(我把没有发现链接归咎于我狡猾的屏幕颜色)@TomDoesCode,没问题。:)我非常感谢您提供的任何线索和帮助。解决方法是使用组件中的LINQ扩展方法
QueryByCube
。(免责声明:我是AdaptiveLINQ开发人员)。可以对odata的结果应用任何过滤器或组吗?比如说,我只想选择那些总数为2的人。甚至有可能吗?您可以通过在查询中添加&$filter=total eq 2
来$filter
按结果分组,但这不太有用,它不会返回满足条件的所有项目,只返回满足条件的组。根据标准,这应该可以工作。。。但是微软的实现被破坏了,没有做到这一点。。。还是!在您发布此消息将近一年后:(
select status, count(*) from entity group by status;