Фильтрация двухуровневой иерархии с помощью содержимого в ODATA-v4 - PullRequest
0 голосов
/ 18 января 2019

Предполагая, что отношения между Гонкой, Командой и Производителем Автомобилей очень много: много. В гонке может участвовать много команд, в команде может быть много производителей автомобилей, производители автомобилей могут спонсировать много команд, а команды могут участвовать во многих гонках.

Используя odata v-4, как выбрать все гонки с участием автомобилей указанных производителей.

Если бы я хотел выбрать все расы, включая Команду с идентификатором 475 и 476, я бы сформировал свой запрос на данные как

Race$expand=Team($select=id,name)&$filter=((Team/any(c:((c/id eq 475) or (c/id eq 476)))))

Но как бы я сформировал свой URL, если бы я хотел выбрать все гонки с участием команд, которые используют производителя автомобилей с Ford или Chevy.

В SQL я бы просто сделал:

SELECT *
FROM   race
WHERE  id IN ((SELECT raceid
               FROM   race_team
               WHERE  teamid IN (SELECT teamid
                                 FROM   team_carmanufacturer
                                 WHERE  carid IN (SELECT id
                                                  FROM   carmanufacturer
                                                  WHERE name IN
                                                 ( 'ford', 'chevy' )
                                                 )))) 

race_team, team_carmanufacturer - это просто множество таблиц сопоставления в базе данных.

enter image description here

1 Ответ

0 голосов
/ 21 января 2019

Вы можете попробовать что-то вроде этого:

Race?$filter=Team/any(y:y/Manufacturer/any(z:z/name eq 'ford' or z/name eq 'chevy' ))&$expand=Team($expand=Manufacturer)

Немного трудно понять это правильно без конечной точки. Также убедитесь, что ваш контроллер поддерживает глубину расширения не менее 2 .

ТБХ, я не думаю, что это очень практичный способ использовать со временем. Подумайте об использовании статической конечной точки, которая работает в качестве параметра для брендов вашего производителя.

Приветствия

...