Я заканчиваю службу 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 был переключатель или что-то вроде: «О, я вижу, вы фильтруете детей - пусть я автоматически применяю этот фильтр к соответствующим вложенным расширениям ". Я знаю, что это длинный путь, но есть ли способ сделать это без повторения критериев и без написания кода для автоматического изменения запроса самостоятельно?