Подтвердить что ты не робот

ApiController против ODataController при экспонировании DTO

Может ли кто-нибудь объяснить мне, когда я должен наследовать мою форму контроллера 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, но вышеупомянутая несогласованность заставляет меня делать что-то неправильно.

4b9b3361

Ответ 1

Может кто-нибудь объяснить мне, когда я должен наследовать мою форму контроллера ODataController vs ApiController?

Вы хотели бы наследовать от ODataController, если хотите открыть конечную точку, которая придерживается протокола OData. Если вы хотите сделать что-то еще, например конечную точку REST, наследуйте от ApiController.

Применять некоторые части структуры OData WebAPI, но не другие, вероятно, не очень хорошая идея. Это может быть в некоторых случаях, но, вероятно, не будет работать хорошо в других. Например, вы можете получить поддержку запросов, но конечная точка $metadata не может быть сгенерирована (это просто предположение, фактические симптомы могут быть разными).

Похоже, вы уже используете EntityFramework. Я знаю, что есть несколько примеров, показывающих, как выставить это как конечную точку OData.

Если вы не хотите делать это по какой-либо причине, вы можете выполнить запрос самостоятельно. Это кратко описано в нескольких местах этот учебник, но суть состоит в том, чтобы добавить к вашему действию параметр типа ODataQueryOptions<T> и использовать методы на нем для фильтрации вашего результирующего набора. Тем не менее, может быть больно генерировать хорошие запросы к базе данных для всех возможных запросов OData, поэтому вам следует избегать, если это возможно.