Как правильно запросить OData с фильтром во вложенном типе на основе свойства из родительского типа? - PullRequest
1 голос
/ 08 февраля 2020

Я получаю значение Dynami c (_FilterDate) для родительского типа, которое я хочу использовать в качестве фильтра для вложенного типа /Trips, но не могу заставить его работать, потому что я все еще получаю записи во вложенном данные, которые не соответствуют фильтру. На самом деле, нет никакой разницы, использую ли я этот фильтр.

$filter=Trips/all(d:d/EndDate ge _FilterDate)

Я также попробовал это:

$expand=Trips($filter=EndDate ge $it/_FilterDate)

, но получил ошибку: «Не удалось найти свойство с именем» _FilterDate 'для типа' Default.Trips '. "

Поэтому мне интересно, как правильно понять синтаксис и, таким образом, любезно обратиться за помощью.

Пример части:

"value": [
       {
           "_FilterCompany": "YES",
           "_FilterLocation": "YES",
           "_FilterDate": "2020-01-08",
           "Trips": [
               {
                   "StartDate": "2019-06-24",
                   "EndDate": "2019-06-28",
               },
               {
                   "StartDate": "2020-02-07",
                   "EndDate": "2020-02-07",
               }         
                     ]
       }

1 Ответ

0 голосов
/ 11 февраля 2020

Здесь происходит две проблемы:

Этот ответ конкретно касается спецификации OData v4 и реализации. Net ODataLib.

  1. Вы правильно определили, что при фильтрации результатов на основе вложенной коллекции вам необходимо отдельно применять фильтр в этой коллекции, если вы хотите, чтобы установщик применился и к элементам в этой коллекции.
    • Это потому, что критерии root level $filter влияют только на выбор элементов root, представьте себе, что оператор $expand применяется после того, как $filter определил верхнюю уровень строки возврата, $expand просто выполняется как оператор Linq Include.
  2. Во второй попытке $it ссылки экземпляр Trips, который является известной ошибкой / по замыслу, согласно спецификации c ожидается, что он будет работать так, как вы его реализовали:

    5.1.1.6 .4 $ it
    Пример 82: клиенты вместе со своими заказами, отправленными в тот же город, что и адрес клиента. Вложенное выражение фильтра оценивается в контексте заказов; $ позволяет ссылаться на значения во внешнем контексте клиентов.

    http://host/service/Customers?
        $expand=Orders($filter=$it/Address/City eq ShipTo/City)
    

    Таким образом, зная, что $ сломан, spe c do c действительно указывает $root идентификатор, который вы также можете использовать, но в ODataLib 7.3 $root также не поддерживается OOTB. Здесь записана проблема: $ ссылается на неверный ресурс # 616

Обходной путь

Если тип данных Trips имеет навигацию обратно к записи Filter / root, затем вы можете использовать это свойство навигации как часть $ filter:

Предполагая, что свойство навигации называется Filter

$filter=Trips/all(d:d/EndDate ge _FilterDate)&$expand=Trips($filter=EndDate ge Filter/_FilterDate)

Если ваш тип Trips не имеет этой навигационной ссылки обратно к родительской записи, то вы застряли на этом этапе с этими двумя обходными путями:

  1. Создать Function на контроллере, чтобы возвращать эти отфильтрованные данные специально, так как это было бы просто оценить как Linq запрос в на стороне сервера .
  2. Принять, что сервер будет вернуть дополнительные строки в коллекции Trips и применить фильтр к результатам в на стороне клиента .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...