0

我有 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
}

编辑我知道我必须更改此行加入办公室的详细信息。emp.EmployeeID 上的办公室等于 office.EmployeeID 到左外连接...

4

2 回答 2

1

您正在尝试完成一些在数据库术语中称为“左外连接”的事情。要在 LINQ 中完成此操作,需要使用该DefaultIfEmpty方法为缺少的右侧生成默认对象,如此 MSDN 文章中所述

在您的情况下,它看起来像:

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
                       }
于 2013-04-04T19:56:56.677 回答
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
}
于 2013-04-04T19:55:53.543 回答