Это решение для подзапроса или нескольких запросов с множественным объединением в EF Core / linq - PullRequest
0 голосов
/ 25 февраля 2020

у меня есть эти таблицы

Location midtown = new Location {name = "midtown", lid = 1}
Location uptown = new Location {name = "uptown", lid = 2}
Location downtown= new Location {name = "downtown", lid = 3}

Person todd = new Person {pid=1, name = "todd"}
Person jane = new Person {pid=2, name = "jane"}
Person john = new Person {pid=3, name = "john"}
Person mary = new Person {pid=3, name = "mary"}

Role commander = new Role {rid=1, name = "commander"}
Role guard = new Role {rid=2, name = "guard"}
Role admin = new Role {rid=3, name = "admin"}

PersonLocation PL1 = new PersonLocation {pid=1, lid=1};
PersonLocation PL2 = new PersonLocation {pid=1, lid=2};
PersonLocation PL3 = new PersonLocation {pid=2, lid=1};
PersonLocation PL4 = new PersonLocation {pid=3, lid=2};>
PersonLocation PL5 = new PersonLocation {pid=3, lid=3};
PersonLocation PL6 = new PersonLocation {pid=4, lid=1};
PersonLocation PL7 = new PersonLocation {pid=4, lid=2};
PersonLocation PL8 = new PersonLocation {pid=4, lid=3};

RoleLocation RL1 = new RoleLocation{rid=1, lid=1};
RoleLocation RL2 = new RoleLocation{rid=2, lid=1};
RoleLocation RL3 = new RoleLocation{rid=3, lid=2};
RoleLocation RL5 = new RoleLocation{rid=1, lid=3};
RoleLocation RL4 = new RoleLocation{rid=2, lid=3};

Какой лучший запрос (запросы) написать
, чтобы я мог найти всех людей в определенных местах с определенными ролями

в SQL я бы сделал:

select p.pid, pl.lid from person p
join PersonLocation pl on pl.pid=p.pid
where pl.lid in (select lid from RoleLocation rl where (lid=1 or lid=2) and (rid=1 or rid=3))

ie,
расскажи мне всем людям, которые находятся в центре города и в верхней части города, где роли центра 1 и типа 2 имеют тип 1 или тип 2

в ссылках на эти посты:
Как использовать ключевое слово 'In' SQL в Entity Framework?
Подзапрос с Entity Framework
Entity Framework объединяет 3 таблицы

Мне удалось придумать это:

var result = from p in Person
                join pl in PersonLocation on p.pid equals pl.pid
                where (from r in Role
                       join rl in RoleLocation on r.ID equals rl.Role.ID
                       where rl.Role.rid == 1 or r.Role.rid==2
                       select rl.Location.ID).Contains(pl.lid)
                select p;

, что довольно круто -
но что, если я хотел добавив другие факторы, такие как PersonGender / RoleGender PersonType / RoleType
, можно предположить, что это может стать довольно массовым

Я не уверен с EF, если я должен сделать несколько запросов
или это выполнимо с подзапросами или объединениями

Какой самый эффективный / лучший способ сделать это с EF Core / linq
бонусные баллы, если вы можете показать мне способ сделать это с помощью методов dbcontext

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