ASP.net MVC 4 (веб-API) Конфигурация OData - PullRequest
6 голосов
/ 21 февраля 2012

Играю с (приложение на одну страницу) BigShelf сэмпл.Я нашел действительно интересным метод GetBooksForSearch (/ api / BigShelf / GetBooksForSearch), который требует дополнительных параметров $filter, $inlinecount, $top, $skip для подкачки и фильтрации результатов, которых нет в коде контроллера:

public IQueryable<Book> GetBooksForSearch
    (string profileIds, Sort sort, bool sortAscending)

Я не могу найти никаких документов о том, как этот контроллер переводит и фильтрует результат впоследствии и, что более важно, как настроить такое поведение (например, ограничить максимальный результат), у кого-нибудь есть подсказка?

- Обновлено -

Обнаружено, что MVC Web API делает свое дело.Но как мы можем это настроить?

Ответы [ 4 ]

14 голосов
/ 14 августа 2012

Похоже, что ResultLimitAttribute был удален. Смотрите это коммит

Было добавлено свойство атрибута [Queryable], которое теперь требуется для поддержки OData. Смотрите обсуждение здесь

Правильное использование теперь будет

[Queryable(ResultLimit = 10)]

[UPDATE]

Начиная с окончательной первоначальной версии, функция ResultLimit в Queryable была удалена. Кроме того, [Queryable] был перемещен в свой собственный пакет предварительного просмотра. См. это сообщение в блоге для получения дополнительной информации и это сообщение для получения инструкций по новому использованию.

[ОБНОВЛЕНИЕ 2 11-16-12] В ASP.Net Fall 2012 Update Preview все снова обновилось. Свойство ResultLimit атрибута [Queryable] было добавлено обратно в пакет OData.

См. Статью здесь для ознакомления с некоторыми из изменений.

Здесь - это обновленный пакет Nuget. На момент написания статьи это был ПРЕДВАРИТЕЛЬНЫЙ пакет.

11 голосов
/ 21 февраля 2012

Существует атрибут фильтра действия с именем ResultLimitAttribute, который можно использовать в любом методе действия, который возвращает IQueryable<T> или даже IEnumerable<T> для ограничения количества возвращаемых данных.

[ResultLimit(100)]
public IQueryable<Product> Get() {
    // ...
}
3 голосов
/ 21 февраля 2012

Существует короткая веб-трансляция о пейджинге и запросах с помощью MVC Web API, которую вы можете посмотреть здесь

В нем объясняется, как вы можете выполнять пейджинг с помощью

  • используя синтаксис запроса OData, и в этом случае Web API автоматически интерпретирует и извлекает результаты для вас
  • или путем написания собственного метода, который принимает в качестве параметров pageIndex и pageSize, а затем возвращаетзапрошенное количество элементов.

AFAIK, вы не можете настроить максимальное количество элементов, возвращаемых с помощью первого метода, но вы можете ограничить количество элементов, возвращаемых с помощью второго подхода, и просто проверитьif (pageSize>maxPage) then return maxPage items.

1 голос
/ 09 сентября 2014

Как указал Коди Кларк, в этой области со временем произошел целый ряд изменений.Начиная с версии 5.2 WebAPI, вы теперь используете EnableQueryAnnotation и используете параметр PageSize вместо QueryableAttribute или ResultLimit.([Queryable] будет по-прежнему работать, но он помечен как устаревший.) В настоящее время вы будете использовать следующий синтаксис:

[EnableQuery(PageSize = 20, MaxTop = 20)]
public IQueryable<Product> Get() {
    // ...
}

Используя PageSize, вы задаете размер страницы по умолчанию для непараметризованных запросов.Если вы не включите значение MaxTop, мошеннический клиент может установить верхнее значение на очень высокое значение и обойти настройки страницы по умолчанию.С MaxTop вы получите исключение, если клиент запрашивает больше записей, чем поддерживает ваш API.

...