Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带$count的OData v4 groupby_C#_Asp.net Web Api_Odata - Fatal编程技术网

C# 带$count的OData v4 groupby

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

我将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=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;