2017-01-09 76 views
1

我使用OData的V4與這些的NuGet的程序包的WebAPI:

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 

我也看到了有關虛擬財產$count ,但它似乎是微軟的doesn't support it yet

如何使用group by以及簡單的count與OData v4?

+0

它看起來像這樣可能不支持尚未:HTTPS ://github.com/OData/WebApi/issues/773 – TomDoesCode

+0

@TomDoesCode,是的。我的問題中有同樣的鏈接,但我希望可以通過其他方式完成。 – smoksnes

+0

哦,是的,我現在看到它,對不起! (我指責我的狡猾的屏幕顏色沒有發現鏈接) – TomDoesCode

回答

1

雖然不支持$ count,但contdistinct已經支持了一段時間,對於OData聚合場景可能在語法上更加正確,文檔有點缺乏,但countdistinct給予調用者控制在哪個字段中使用結果集來確定獨特的結果。這在複雜的嵌套或擴展分組查詢中特別有用。

所以事實證明,你的查詢中有一個簡單的錯誤!

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

您所要求的計數所有不同的狀態值。因爲您按狀態分組,所以每組中的不同值將始終爲1 :)

您的實際查詢應該是針對集合中的每個項目(通常是Id)的唯一屬性countdistinct。負有交付有一個叫做「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