2017-01-09 11 views
1

Я использую 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 

Я также читал о виртуальной собственности $count , но это похоже на Microsoft 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 не поддерживается, contidistinct поддерживается некоторое время и, возможно, более синтаксически корректно для сценариев агрегации OData, документации немного не хватает, но countdistinct дает контроль вызывающего абонента, какое поле использовать в результат, чтобы определить уникальные результаты. Это особенно полезно для сложных вложенных или расширенных запросов группировки.

Итак, у вас есть простая ошибка в вашем запросе!

В запросе: /odata/deliveries?$apply=groupby((status),aggregate(status with countdistinct as total))

Вы просите посчитать все различные значения статуса. Поскольку вы группируете по статусу, отдельные значения в каждой группе всегда будут равны 1 :)

Ваш фактический запрос должен состоять в том, чтобы подсчитывать свойство, которое будет уникальным для каждого элемента в наборе, как правило, 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