Как выполнить INNER JOIN против LEFT JOIN в Entity Framework Core (> 2.1) - PullRequest
0 голосов
/ 13 июня 2019

это может быть старый и постоянный вопрос для 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 понимает , чтобы дифференцировать правильное соединение, которое мы хотим.

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