Pull to refresh

Comments 5

Используем OData в своих проектах. Что тут можно сказать - это боль и страдания, когда пытаешься сделать шаг влево-вправо. В базовом сценарии работает неплохо, но чуть сложнее - и всё, лютые костыли повсюду.

Пример: вернуть по запросу для одной модели другие модели (например, если фильтр по пользователям, а вернуть надо посты этих пользователей) - через одату мы это сделать так и не смогли, потому что по концепции Микрософта какая сущность в запросе, такая и в ответе.

Куча странного с версионированием api. Например, для v1 нормально работает get/{id}, а для v2 работает только get/{key}, потому что key - конвенционное имя. Это справедливо для 7 версии по крайней мере

Боль миграции - мы до сих пор не можем переехать на последнюю версию пакетов, потому что то одно, то другое отваливается в непредсказуемых местах...

Кроме того, что odata - это почти прямой интерфейс к БД, при котором вся ответственность за оптимальность запросов (если отбросить другие негативные аспекты этого) переложена на клиента и магию EF. Подозреваю (сами не пробовали), что всякие самописные запросы или хранимые процедуры выставить через одату будет тем ещё квестом, особенно с учётом всяких select/expand-опций.

В общем, на наших проектах мы стремимся отказаться от неё настолько, насколько это возможно, и использовать по минимуму. Для меня лично вырисовываются следующие приемлемые кейсы:

  • прототип API или сервиса, когда надо быстро достать данные из БД, а клиент ещё сам не до конца понимает, какие данные нужны (обычно после этого написанный API выкидывается и пишется пачка нужных методов)

  • ненагруженный API, который тем не менее должен иметь некоторую вариативность. Тут проще выставить OData-метод и смириться с тем, что запрос будет генерировать клиент

OData подкупает своей кажущейся простотой и отсутствием необходимости писать 100500 разных методов API с разными возвращаемыми данными, но "вдолгую" всё равно оказывается необходимым эти самые методы написать и под них оптимизировать запросы

я не продаю ОДату, но хотел спросить насчёт постов пользователей… а почему вам $expand не помог? Ведь в рамках стандарта вы получаете список пользователей и раскрываете их посты.

Просто в случае если вам нужны только сообщения пользователей, вы же наверняка имеете связку от ребёнка к родителю, где теоретически фильтр должен будет сработать.

В худшем случае, вы всегда можете написать оптимизированную версию custom-действия — принять определенные параметры, вернуть другие значения.

expand не помог потому, что там нет прямой связи между сущностями. В данном конкретном примере требовалась дополнительная логика по выборке данных из базы.

А функция не взлетела по следующей причине (вероятно, я ввёл в заблуждение слишком кратким описанием примера) : нам надо было, чтобы опция filter работала по одной сущности (пользователь), а другие опции (select/expand) - уже по возвращаем ой коллекции постов. Вот в такое одата не смогла, пришлось подставлять костыли

Спасибо за уточнение, пусть будет так.

Я обычно воспринимаю этот протокол как некоторый стандарт для моделирования выходных данных, и у него есть своя цена.

Я не думаю, что с каким-нибудь GraphQL всё взлетело бы с двумя строчками, они обычно дают вам на входе контракт, а реализацию выдумываете сами.

Я в своих проектах одата использую для отчётности. Делается метариализованное представление, прописывается в качестве entity, интегрируется в Excel или power bi и можно забыть навсегда. Работает отлично.

Sign up to leave a comment.

Articles