Может ли кто-нибудь объяснить мне, когда я должен наследовать мою форму контроллера ODataController
vs ApiController
?
Вопрос вызван тем, что результаты, возвращаемые ApiController
, могут быть отфильтрованы с помощью запроса OData.
Если я применяю методы t23 к методам contoller, запрос обрабатывается, даже если действие возвращает IEnumerable
.
Однако без этого атрибута, но с вызовом config.EnableQuerySupport()
запрос обрабатывается только в том случае, если метод возвращает IQueryable
.
Я думаю, что это непротиворечивое поведение. WebAPI документация и примеры подразумевают, что контроллер должен inerit от ODataController. И я немного смущен.
Либо ApiController
accidentally
, либо частично поддерживает часть (по крайней мере $skip, $filter и $top) протокола OData. Или это по дизайну, и мне нужен ODataController для полного ODataSupport.
Реальные проблемы состоят в том, что моя служба предоставляет DTO, а не POCOs. Может быть не один к одному сопоставлению. Там нужно преобразовать запрос OData снова DTOs в EF запрос против POCOs.
Теперь просто играю с OData. Я извлекаю объекты и преобразовываю их в DTO. По общему признанию, это не очень эффективно, чтобы получить все из БД для каждого запроса, но все же переносимого для экспериментов. Но нет необходимости возвращать все объекты клиенту, если для этого требуется некоторое отфильтрованное подмножество DTO.
Запрос OData начал работать из коробки с атрибутами ApiController и Querayble, но вышеупомянутая несогласованность заставляет меня делать что-то неправильно.