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