从连接表中抓取数据,如果没有连接表的结果,仍然抓取数据

本文关键字:抓取 数据 连接 结果 如果没有 | 更新日期: 2023-09-27 18:07:22

我有两张桌子,员工和办公室我想让所有员工都回去,不管他们是否有办公室(没有办公室是一个新的要求)。但如果他们确实有办公室,我想返回所有办公室的详细信息。

现在查询只返回有办公室的员工…这是不理想的

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
}
我知道我必须修改这一行加入办公室细节。雇员id等于办公室。

从连接表中抓取数据,如果没有连接表的结果,仍然抓取数据

您正在尝试完成在数据库术语中称为"左外连接"的事情。要在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
                       }

您可以这样做来绕过内部连接:

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
}