у меня есть эти таблицы
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