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

Возможный дубликат:
Разбиение на страницы 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?


person np-hard    schedule 02.07.2012    source источник


Ответы (3)


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

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

person Filip W    schedule 23.08.2012
comment
Есть ли шанс, что вы переместите этот ответ в вопрос, который я назвал дублированием и VTCing (при условии, что вы согласны с этим), и я проголосую там? (Если вы не согласны, я могу удалить комментарий) - person Ruben Bartelink; 02.10.2012
comment
Спасибо за переезд - это еще один счастливый уборщик! - person Ruben Bartelink; 02.10.2012

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

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

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

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

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

person Mark    schedule 03.07.2012
comment
См. также другой ответ - person Ruben Bartelink; 01.10.2012
comment
Есть ли шанс, что вы переместите этот ответ в вопрос, который я назвал дублированием и VTCing (при условии, что вы согласны с этим), и я проголосую там? (Если вы не согласны, я могу удалить комментарий) - person Ruben Bartelink; 02.10.2012
comment
сообщение перемещено в сообщение перемещено в stackoverflow.com/questions/10706479 - person Mark; 02.10.2012
comment
Спасибо, это еще один счастливый уборщик! - person Ruben Bartelink; 02.10.2012

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

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

person Szilard Muzsi    schedule 03.07.2012