В дискуссии к предыдущей статье dezconnect поднял интересный вопрос о возможностях OData выполнять рекурсивные запросы (по аналогии с SQL CTE).
В документации OData в разделе 11.2.4.2 описывается опция запроса $expand. Эта опция позволяет получать объекты вместе со связанными объектами. Например, Вы можете получить данные о компании вместе со всеми данными о ее президенте:
http://nitrosdata.com/service/testdb/company(company1)?$expand=president
Без опции $expand результат будет включать только id президента компании (или ссылку при других настройках).
http://nitrosdata.com/service/testdb/company(company1)
В 4й версии OData существенно расширены возможности опции $expand для выполнения рекурсивных запросов.
Например, у человека есть друзья, у них в свою очередь тоже есть друзья и мы хотим получить все дерево друзей. Чтобы легче было писать такие рекурсивные запросы OData вводит дополнительную опцию $level, определяющую глубину рекурсии:
http://yourhost/service/yourdatabase/person(1)?$expand=friends($level=2)
Данный запрос построит дерево (по связи friends) на глубину = 2.
Возможно задать поиск без ограничения глубины рекурсии, указав $levels=max.
Но в этом случае возникает проблема циклических связей. Стандарт не оговаривает, что должно происходить при наличии циклических связей – поэтому в этом случае следует ограничить глубину рекурсии конкретным значением.
Автор: NitrosData