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

时间:2013-04-04 19:45:29

标签: c# linq

我有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到左外连接...

2 个答案:

答案 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
}