2012-05-22 4 views
10

Я использую OData для разбивки длинного списка элементов, возвращаемых с помощью веб-ави. Я могу фильтровать данные через URL с индексом начала и конца.

Вопрос, который у меня есть, как узнать общее количество предметов? Таким образом, я могу отображать страницу 1 из 3 (20 элементов) на мобильном устройстве, которое вызывает веб-api.

+0

Обратите внимание, что общее количество элементов может меняться во время чтения пользователем страниц. Например, если «элементы» в вашем списке являются ответами на вопрос SO, то число может увеличиться от 20 до 30, прежде чем пользователь достигнет конца списка. Это делает общее количество страниц несколько неопределенным. – Peter

ответ

3

Вы можете использовать $ inlinecount = allpages в запросе, чтобы получить счет всех объектов в результатах без верхнего и пропустить. Например:

http://services.odata.org/OData/OData.svc/Products $ топ = 1 & пропустить = 1 & $ inlinecount = AllPages

Возвращает один продукт, а также встроенный счетчик 9 (так как существует 9 продуктов в наборе сущностей).

+1

Спасибо, но нашел следующую ссылку, из-за которой он не поддерживается из коробки -> http://thedevstop.wordpress.com/2012/04/05/adding-odata-inline-count-support-to-the- asp-net-web-api/ – amateur

+1

, пытающийся выполнить это с помощью Microsoft.AspNet.WebApi.OData версии 0.1.0-alpha-120815 возвращает 400 - {«Сообщение»: «Параметр запроса« $ inlinecount »не поддерживается.»} –

+1

$ inlinecount устарел. См. Мой ответ здесь: http: // stackoverflow.com/a/31004759/331281 – Dejan

6

Вот ссылка на рабочую версию, она реализована как QueryableAttribute. http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/88372a0b4ab9#src%2fMicrosoft.Web.Http.Data%2fQueryFilterAttribute.cs

редактировать: Используйте эту ссылку для подробного объяснения -> http://www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-package/

+0

Этот URL-адрес недействителен на данный момент: «URL не действителен К сожалению, строка запроса URL-адреса недействительна. Если вы по-прежнему испытываете проблемы или хотите отправить нам дополнительную информацию об этой ошибке, свяжитесь с нами. Вернитесь на домашнюю страницу CodePlex. " –

+1

Обновлено link :) –

+1

Я знаю, что сейчас это немного устарело, но для тех, кто просматривает это для совета, вы можете рассмотреть Linq to Querystring, который поддерживает $ inlinecount из коробки: https://github.com/ Roysvork/LinqToQuerystring/ –

3

Попробуйте этот подход: http://www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-package/

Он использует последнюю версию пакета OData Web API.

До тех пор пока окончательный пакет API API API не будет отправлен (в этом случае осенью этого года должно быть около ноября), когда $ inlinecount поддерживается из коробки, это решение, скорее всего, будет лучшим.

+0

Работает и для меня. Круто! – asa

2

У меня был точный номер на прошлой неделе. Check out Extending your ASP.NET Web API responses with useful metadata

Я использовал этот пост и пример кода, чтобы получить сетку поискового вызова и использовать OData. Как указано в образце, я создал обработчик делегирования для захвата HttpResponseMessage и обернул его в пользовательские метаданные, включающие подсчет элементов. Также создается пользовательский атрибут CustomQueryableAttribute, который наследует значение QueryableAttribute по умолчанию.

Это может показаться немного сложным, но на самом деле довольно просто реализовать. Я заработал около 30 минут.

Надеемся, что в будущих версиях API веб-интерфейса будет более полная поддержка OData.

EDIT: Поддержка Odata НЕ будет поставляться с веб-API. Атрибут queryable удаляется для выпуска RTM. Более полная поддержка OData будет доступна через некоторое время после первоначального обновления через отдельный пакет Nuget.

+0

переехал из http://stackoverflow.com/questions/1130049 – Mark

Смежные вопросы