对于Entity Framework Core,这可能是一个古老而持续的问题,但我进行了很多研究,但未能获得答案。我们曾经用SQL编写存储过程,所以我们将使用像 Inner Join 和 Left Join 这样的运算符,最近我们正在使用C#重写Entity Framework Core中的所有内容。但是,我们发现无论使用 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
假设我们已经在实体框架中定义了 User , UserRole 和 UserGroup 类,我们该如何执行 Inner在这里在Entity Framework Core中同时与UserRole 和与UserGroup左合并一起加入?
我尝试使用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 进行配合,但是我们认为这不是使用实体框架的一种属性方式。可以用传统的 Include 和 linq-to-sql 方法完成吗?
我还查看了answer about using WithRequired
and WithOptional
与FluentApi的表映射关系,但这不是我想要的,因为我的某些业务逻辑需要INNER JOIN
和User
之间的UserRole
而其他情况可能需要在LEFT JOIN
和User
之间使用UserRole
,因此我们需要编写EF可以理解的 query 或代码我们想要的正确联接。