我有2张桌子,员工和办公室 我想要归还所有员工,无论他们是否有办公室(没有办公室是新要求)。但如果他们确实有办公室,我想退回所有的办公室细节。
现在查询只返回有办公室的员工......这不是理想的
var employeesDetails = from emp in details.FindEmployeeByLastName(lastName)
join office in details.Offices on emp.EmployeeID equals office.EmployeeID
select new {
EmpID = emp.EmpID
OfficeID = (office == null) ? -1 : office.OfficeID,
//...etc
}
编辑我知道我必须改变这一行 在office.inmployeeID上的办公室等于office.EmployeeID到左外连接...
答案 0 :(得分:1)
您正在尝试以数据库术语称为“左外连接”。要在LINQ中完成此任务,需要使用DefaultIfEmpty
方法为缺少的右侧生成默认对象,如this MSDN article
在您的情况下,它看起来像:
var employeesDetails = from emp in details.FindEmployeeByLastName(lastName)
join office in details.Offices on emp.EmployeeID equals office.EmployeeID into offices
from empoffice in offices.DefaultIfEmpty()
select new {
EmpID = emp.EmpID
OfficeID = (empoffice == null) ? -1 : empoffice .OfficeID,
//...etc
}
答案 1 :(得分:0)
你可以做这样的事情来规避内部联接:
var employeesDetails = from emp in details.FindEmployeeByLastName(lastName)
let office = details.Offices
.Where(o => emp.EmployeeID == o.EmployeeID)
.FirstOrDefault()
select new {
EmpID = emp.EmpID
OfficeID = (office == null) ? -1 : office.OfficeID,
//...etc
}