Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Реализация oData inlinecount с использованием asp.net webapi

Автор вопроса: np-hardОтветов: 3

Возможный дубликат:
Разбиение на страницы OData с помощью WebApi ( $inlinecount )

Поскольку Asp.net WebAPi почти поддерживает odata, мне очень заманчиво заставить $inlinecount работать, чтобы он хорошо работал с пользовательским интерфейсом кендо (или любым другим). Чтобы он возвращал значение в формате jsonp, я реализовал новый MediaFormatter (из Stackoverflow).

Проблема в том, что в результатах должен быть элемент count, чтобы заставить работать пейджинг на стороне сервера, поэтому на данный момент я взломал форматтер, чтобы заставить работать фальшивый счетчик. Все это отлично работает, и сетка полностью удовлетворена, однако получение реального количества является проблемой, поскольку возвращаемое выражение IQueryable уже имеет примененные к нему фильтры/Take и т. д.

 public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
    {
        string callback;
        if (IsJsonpCountableRequest(out callback))
        {
            return Task.Factory.StartNew(() =>
            {
                var q = value as IQueryable<Movie>;
                var count = q.Count(); // this count doesnt return the actual count
                var writer = new StreamWriter(stream);
                writer.Write(callback + "({");
                writer.Write(@"""d""");
                writer.Write(" : { ");
                writer.Write(@"""results""");
                writer.Write(" : ");
                writer.Flush();
                base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext).Wait();
                writer.Write(",");
                writer.Write(@"""__count""");
                writer.Write(" : ");

                writer.Write(string.Format(@"""{0}""", count));
                writer.Write("}");

                writer.Write("})");
                writer.Flush();
            });
        }
        else
        {
            return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext);
        }
    }

Есть ли способ получить счетчик отдельно, может быть, от основного поставщика IQueryable?

odatajsonp

Ответы

Ответ 1 · рейтинг 1 · Filip W

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

Он использует последний пакет OData веб-API.

Ответ 2 · рейтинг 2 · Mark

У меня была точная проблема на прошлой неделе. Ознакомьтесь с разделом Расширение Ответы веб-API ASP.NET с полезными метаданными

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

Здесь это может показаться немного сложным, но на самом деле это довольно просто реализовать. У меня что-то заработало примерно за 30 минут.

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

РЕДАКТИРОВАТЬ: Поддержка Odata НЕ будет поставляться с веб-API. Атрибут queryable удаляется для выпуска RTM. Более полная поддержка OData будет доступна через некоторое время после первоначального выпуска в виде отдельного пакета Nuget.

Ответ 3 · Szilard Muzsi

SPA DataController (производный от ApiController) используется для реализации этой функциональности. Однако с последними изменениями он был удален, так как они планируют поддерживать OData другим способом.

Если вы работаете с бета-версией MVC 4, вы можете просто изменить свой контроллер на DataController, и все готово. Если вы используете RC, вам следует взглянуть на более старый веб-стек ASP.NET коммит в Codeplex. Вас интересует метод ExecuteAsync из DataController.cs.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы