это может быть старый и постоянный вопрос для Entity Framework Core, но я много исследовал и не смог получить ответ.Раньше мы писали процедуру хранения в SQL, поэтому будем использовать операторы типа Inner Join и Left Join , недавно мы переписывали все в Entity Framework Core с использованием C #.Однако мы обнаружили, что независимо от того, используется ли оператор linq-to-sql или Include , для выполнения sql за сценой всегда используется LEFT JOIN .
Например, наша процедура хранения будет выглядеть так:
SELECT *
FROM Users u
INNER JOIN UserRole ur on ur.Uid = u.Uid
LEFT JOIN UserGroup ug on ug.Uid = u.Uid
Предположим, у нас уже есть Пользователь , UserRole и UserGroup класс, уже определенный в Entity Framework, как мы можем выполнить Внутреннее соединение с UserRole и Оставить соединение с UserGroup одновременно в Entity Framework Core здесь?
Вещи, которые я пробовал с использованием Include
:
dbContext.Users.Inlcude(u => u.UserRoles).Include(u => u.UserGroups).ToList();
и использованием linq-to-sql
:
from u in dbContext.Users
join ur in dbContext.UserRole on u.Uid equals ur.Uid
join ug in dbContext.UserGroup on ug.Uid = u.Uid
select new {u.Name, ur.UseRole, ug.Groupname}
Оба вышеупомянутых подхода используют LEFT JOIN
Пока что мы можем использовать DbQuery с FromSql простым sql , но мы не думаем, что это способ использования Entity Framework.Так можно ли это сделать с помощью традиционных Включить и linq-to-sql способов?
Также я посмотрел ответ об использовании WithRequired
и WithOptional
в отношениях отображения таблиц с FluentApi, но это не то, что я хочу, потому что некоторые из моих бизнес-логик нуждаются в INNER JOIN
между User
и UserRole
, в то время как в другом сценарии может потребоваться LEFT JOIN
между User
и UserRole
, поэтому нам нужно написать запрос или код, который EF понимает , чтобы дифференцировать правильное соединение, которое мы хотим.