OData - применение родительского фильтра any / all к вложенному расширению - PullRequest
0 голосов
/ 07 апреля 2020

Я заканчиваю службу OData и сейчас нахожусь в режиме оптимизации. Одна из вещей, которая меня беспокоила, - это применение фильтров для минимизации объема обрабатываемых данных.

Есть ли встроенный способ для OData автоматически применять родительские любые / все фильтры к вложенным расширяется? Например, я могу выполнить следующий запрос:

55s, 3.74MB https://localhost:44322/odata/project?
                $select=Id,Code,Tasks&
                $filter=Status eq 'Active' &
                $expand=Tasks(
                    $select=Id,Code,HierarchyCode,OutlinerString;
                    $filter=EffectiveStatus eq 'Active';
                    $expand=AuthorizedOrgs(
                        $select=Id,Organization;
                        $filter=Status eq 'Active';
                        $expand=Organization($select=Id,Code,Name)))

, и я вернусь ко всем активным проектам; каждый проект будет содержать только активные задачи, а каждая задача будет содержать только активные организации. Я получаю результаты, которые мне интересны (активные организации вместе с родительскими данными проекта / задачи), но они неэффективны - содержат проекты и задачи, которые не соответствуют моему полному набору критериев.

Другой подход будет в основном повторять одни и те же критерии на каждом уровне:

51s, 2.23MB https://localhost:44322/odata/project?
                $select=Id,Code,Tasks&
                $filter=Status eq 'Active' and Tasks/any(t:t/EffectiveStatus eq 'Active' and t/AuthorizedOrgs/any(o:o/Status eq 'Active'))&
                $expand=Tasks(
                    $select=Id,Code,HierarchyCode,OutlinerString;
                    $filter=EffectiveStatus eq 'Active' and AuthorizedOrgs/any(o:o/Status eq 'Active');
                    $expand=AuthorizedOrgs(
                        $select=Id,Organization;
                        $filter=Status eq 'Active';
                        $expand=Organization($select=Id,Code,Name)))

, и я получу только те записи, которые мне интересны (активные проекты, которые содержат только активные задачи с активными организациями) с результирующими данными, равными 40 % меньше. Это замечательно и все, но мне определенно не нравится повторять критерии на каждом уровне.

Было бы неплохо, если бы у OData был переключатель или что-то вроде: «О, я вижу, вы фильтруете детей - пусть я автоматически применяю этот фильтр к соответствующим вложенным расширениям ". Я знаю, что это длинный путь, но есть ли способ сделать это без повторения критериев и без написания кода для автоматического изменения запроса самостоятельно?

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