2016-02-12 41 views
0

这LINQ按预期工作并带回给定的EmployeeLINQ和关联 - 何时需要包含()?

Employees.Where(e => e.EmployeeId == 10).Select(e => new {e.Department}) 

但是相关的Department实体类似的LINQ表达式失败说Department是空

Employees.Where(e => e.EmployeeId == 10).Department 

第一个LINQ声明能确定EmployeesDepartment之间的关联,但第二个LINQ表达式不能。如果我在第二个LINQ示例中使用Include("Department")语句,那么它将起作用并且Department不会为空。

Employees.Include("Department").Where(e => e.EmployeeId == 10).Department 

为什么Include(“Department”)在第一条LINQ语句中不需要?

+0

你确定'Employees.Where(e => e.EmployeeId == 10).Department'编译?它不应该。 –

+0

我不确定它是否编译。我正在使用我的EF组件测试它在LINQPad内部。智能感知不显示任何错误。 – webworm

+0

另一个('Employees.Include(“部门”)。其中(e => e.EmployeeId == 10).Department')没有意义。你确定那里没有“First”或“FirstOrDefault”? –

回答

2

第一条语句是明确要求Employee.Department对象,并且只会返回部门对象。 linq会生成一个内部连接部门表的sql查询。

第二条语句查询员工对象。 Linq建立一个sql查询来返回雇员对象,因为你没有要求部门它不内部加入部门表。雇员对象返回后。正在调用部门属性为空。 .Department部分在linq生成sql查询并返回employee对象后调用。

使用include,linq将查询员工表和内部联接部门表。这将返回员工和employee.department。

使用select是最好的方法,因为你只返回你想要的。出于性能原因,通常应尽可能避免使用include。