使用实体框架(核心)在Linq中进入组后左连接

hid*_*den 6 linq entity-framework

问题:我想使用linq语法(实体框架7)在所需的输出中生成下面的确切sql

问题的目标是生成下面的确切sql! 期望的输出

select a.AppUserId, u.Email, a.FirstName, a.MiddleName, a.LastName, a.IsInternal, a.AspNetUserId, a.PictureLink, a.SignatureLink, a.PhoneNumber, a.Extension, a.FaxNumber, a.MobileNumber, a.Skype, r.Name as 'Role', a.SupervisorId, a.BackUpId, a.HasAutoAssignClaims, a.IsActive
from AppUser a
join AspNetUsers u on a.AspNetUserId = u.Id
left join AspNetUserRoles ur on u.Id = ur.UserId
left join AspNetRoles r on ur.RoleId = r.Id
Run Code Online (Sandbox Code Playgroud)

我只能得到完全相同的sql但内部连接.我似乎无法得到两个左连接.这里的代码如何生成内部联接以及生成左联接的失败尝试.

SELECT [a].[AppUserId], [a].[FirstName], [a].[MiddleName], [a].[LastName], [a].[IsInternal], [a].[AspNetUserId], [a].[PictureLink], [a].[SignatureLink], [a].[PhoneNumber], [a].[Extension], [a].[FaxNumber], [a].[MobileNumber], [a].[Skype], [a].[SupervisorId], [a].[BackUpId], [a].[HasAutoAssignClaims], [a].[IsActive]
FROM [AppUser] AS [a]
INNER JOIN [AspNetUsers] AS [b] ON [a].[AspNetUserId] = [b].[Id]
INNER JOIN [AspNetUserRoles] AS [c] ON [b].[Id] = [c].[UserId]
INNER JOIN [AspNetRoles] AS [d] ON [a].[RoleId] = [d].[Id]
Run Code Online (Sandbox Code Playgroud)

内连接的代码有效但我想要左连接....:

 var query = (
                              //INNER JOIN 
                              from a in _dbCtx.AppUser
                              join b in _dbCtx.Users
                              on a.AspNetUserId equals b.Id 


                              ////LEFT JOIN
                              join c in _dbCtx.UserRoles
                              on b.Id equals c.UserId 

                              //    //    //LEFT JOIN  (if you wanted right join the easiest way is to flip the order of the tables. 
                              join d in _dbCtx.Roles
                              on a.RoleId equals d.Id





                          select new
                          {
                              AppUserId = a.AppUserId,
                              //Email = b.Email,
                              FirstName = a.FirstName,
                              MiddleName = a.MiddleName,
                              LastName = a.LastName,
                              IsInternal = a.IsInternal,
                              AspNetUserId = a.AspNetUserId,
                              PictureLink = a.PictureLink,
                              SignatureLink = a.SignatureLink,
                              PhoneNumber = a.PhoneNumber,
                              Extension = a.Extension,
                              FaxNumber = a.FaxNumber,
                              MobileNumber = a.MobileNumber,
                              Skype = a.Skype,
                              //Role = d.Name != null ? string.Empty :d.Name ,
                              SupervisorId = a.SupervisorId,
                              BackUpId = a.BackUpId,
                              HasAutoAssignClaims = a.HasAutoAssignClaims,
                              IsActive = a.IsActive

                          }).ToList();
Run Code Online (Sandbox Code Playgroud)

使用左连接的代码...我错过了一些概念不起作用

什么不起作用是在g2.RoleId等于d.Id进入group3线g2不可用.那么我将如何为我的下一次左连接提供c.RoleId?基本上在你分组之后你显然不能再使用它了.

        var LeftJoin= (
                          //INNER JOIN 
                          from a in _dbCtx.AppUser
                          join b in _dbCtx.Users
                          on a.AspNetUserId equals b.Id 


                          ////LEFT JOIN
                          join c in _dbCtx.UserRoles
                          on b.Id equals c.UserId into group2
                          from g2 in group2.DefaultIfEmpty() //makes it left join 



                          join d in _dbCtx.Roles
                          on g2.RoleId equals d.Id into group3
                          from g3 in group3.DefaultIfEmpty()

                          select new
                          {
                              AppUserId = a.AppUserId,
                              Email = b.Email,
                              FirstName = a.FirstName,
                              MiddleName = a.MiddleName,
                              LastName = a.LastName,
                              IsInternal = a.IsInternal,
                              AspNetUserId = a.AspNetUserId,
                              PictureLink = a.PictureLink,
                              SignatureLink = a.SignatureLink,
                              PhoneNumber = a.PhoneNumber,
                              Extension = a.Extension,
                              FaxNumber = a.FaxNumber,
                              MobileNumber = a.MobileNumber,
                              Skype = a.Skype,
                              Role = g3.Name != null ? string.Empty :g3.Name ,
                              SupervisorId = a.SupervisorId,
                              BackUpId = a.BackUpId,
                              HasAutoAssignClaims = a.HasAutoAssignClaims,
                              IsActive = a.IsActive

                          }).ToList();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

hid*_*den 0

这是一种通过非常糟糕的查询生成数据的解决方法。它生成一系列对数据库的调用,这些调用确实会产生相同的结果集。然而,这绝对不是该工作的最佳查询。我还在等待 RC2,我会更新答案。

 var query = (
                           //INNER JOIN 
                           from a in _dbCtx.AppUser
                           join b in _dbCtx.Users
                           on a.AspNetUserId equals b.Id

                           from c in _dbCtx.UserRoles
                           .Where(x => b!=null && x.UserId == b.Id)
                           .DefaultIfEmpty()

                           from d in _dbCtx.Roles
                             .Where(x => a !=null &&  x.Id == a.RoleId)
                             .DefaultIfEmpty()


                           select new
                           {
                               AppUserId = a.AppUserId,
                              Email = b.Email,
                              FirstName = a.FirstName,
                               MiddleName = a.MiddleName,
                               LastName = a.LastName,
                               IsInternal = a.IsInternal,
                               AspNetUserId = a.AspNetUserId,
                               PictureLink = a.PictureLink,
                               SignatureLink = a.SignatureLink,
                               PhoneNumber = a.PhoneNumber,
                               Extension = a.Extension,
                               FaxNumber = a.FaxNumber,
                               MobileNumber = a.MobileNumber,
                               Skype = a.Skype,
                               Role = d.Name != null ? string.Empty :d.Name ,
                               SupervisorId = a.SupervisorId,
                               BackUpId = a.BackUpId,
                               HasAutoAssignClaims = a.HasAutoAssignClaims,
                               IsActive = a.IsActive

                           }).ToList();
Run Code Online (Sandbox Code Playgroud)