Sql 具有左右连接的linq

Sql 具有左右连接的linq,sql,sql-server,linq,Sql,Sql Server,Linq,我们正在我的应用程序中合并实体框架。我已经将许多简单的存储过程转换为linq查询,但这一个给我带来了麻烦,我不确定我会出什么问题。我的大脑变成了果冻,我无法让它工作。我将非常感谢你的帮助,所以请容忍我 我的SQL是: SELECT ... FROM tblProjectAssignment INNER JOIN tblProjectAssignmentCollection ON tblProjectAssignment.AssignmentID = tblProjectAssignme

我们正在我的应用程序中合并实体框架。我已经将许多简单的存储过程转换为linq查询,但这一个给我带来了麻烦,我不确定我会出什么问题。我的大脑变成了果冻,我无法让它工作。我将非常感谢你的帮助,所以请容忍我

我的SQL是:

SELECT ...
FROM tblProjectAssignment 
INNER JOIN tblProjectAssignmentCollection 
   ON tblProjectAssignment.AssignmentID = tblProjectAssignmentCollection.AssignmentID 
RIGHT OUTER JOIN tblCEQRPhaseIIUsers 
   ON tblProjectAssignment.UserID = tblCEQRPhaseIIUsers.UserID 
LEFT OUTER JOIN tblCEQRAccessUserRole 
   ON tblCEQRPhaseIIUsers.UserRoleTypeID = tblCEQRAccessUserRole.UserRoleTypeID
我需要帮助将上述内容转换为linq查询。我知道
DefaultIfEmpty()
用于外部联接,但我运行查询时得到的结果不正确。因此,我需要的是
tblceqrphaseiusers
,以获得独立于其他表中相应结果的所有结果。以下查询的行为与所有表都具有内部联接一样

var query = from PATable in db.tblProjectAssignments
            from PACTable in db.tblProjectAssignmentCollections.Where(la => la.AssignmentID == PATable.AssignmentID)
            from UserTable in db.tblCEQRPhaseIIUsers.Where(la => la.UserID == PATable.UserID).DefaultIfEmpty()
            from UserRoleTable in db.tblCEQRAccessUserRoles.Where(la => la.UserRoleTypeID == UserTable.UserRoleTypeID).DefaultIfEmpty()
            where (UserTable.FirstName.ToLower().Contains(search.FirstName.Trim().ToLower()) || search.FirstName == null)
            where (UserTable.LastName.ToLower().Contains(search.LastName.Trim().ToLower()) || search.LastName == null)
            where (PACTable.CEQRNumber.ToLower().Contains(search.CEQRNumber.Trim().ToLower()) || search.CEQRNumber == null)
            where (PACTable.ProjectName.ToLower().Contains(search.ProjectName.Trim().ToLower()) || search.ProjectName == null)
            where (PATable.IsActive == true)
            where (UserTable.IsActive == true)
            select new
            {
                AssignmentID = PATable.AssignmentID,
                UserID = PATable.UserID,
                FirstName = UserTable.FirstName,
                MiddleName = UserTable.MiddleName ?? string.Empty,
                LastName = UserTable.LastName,
                UserRole = UserRoleTable.UserRoleName,
                CEQRNumber = PACTable.CEQRNumber,
                ProjectName = PACTable.ProjectName,
                CollectionID = PACTable.CollectionID,
                EmailAddress = UserTable.EmailAddress,
                AssignmentIsActive = PACTable.IsActive
            };

问题是您不能在
linq
中执行
右连接。好消息是,您可以重写查询以避免使用
右连接
。您可以通过重新排列表并使用
左联接来实现这一点

目前您正在执行以下操作:

select ...
from [MainTable] m
inner join [InnerTable] i on m.Num = i.Num
right join [RightTable] r on m.Num = r.Num
left join [LeftTable] l on r.Num = l.Num
这应该相当于:

select... 
from [RightTable] r 
left join [LeftTable] l on r.Num = l.Num
left join [MainTable] m on m.Num = r.Num
left join [InnerTable] i on m.Num = i.Num
现在您有了一个没有
右连接的查询
,您应该能够编写linq查询了