C# LINQ和关联-何时需要Include()?

C# LINQ和关联-何时需要Include()?,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,此LINQ按预期工作,并返回与给定员工关联的部门实体 Employees.Where(e => e.EmployeeId == 10).Select(e => new {e.Department}) 但是,类似的LINQ表达式无法表示部门为空 Employees.Where(e => e.EmployeeId == 10).Department 第一个LINQ语句能够确定员工和部门之间的关联,但第二个LINQ表达式不能。如果我在第二个LINQ示例中使用Include(“D

此LINQ按预期工作,并返回与给定
员工关联的
部门
实体

Employees.Where(e => e.EmployeeId == 10).Select(e => new {e.Department})
但是,类似的LINQ表达式无法表示
部门
为空

Employees.Where(e => e.EmployeeId == 10).Department 
第一个LINQ语句能够确定
员工
部门
之间的关联,但第二个LINQ表达式不能。如果我在第二个LINQ示例中使用
Include(“Department”)
语句,那么它将工作,
Department
将不为空

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

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

第一个语句明确要求Employee.Department对象,并且只返回Department对象。所发生的事情是linq构建一个sql查询,该查询内部连接department表

第二条语句查询employee对象。Linq构建一个sql查询,只返回employee对象,因为您没有请求department,所以它不会内部联接department表。返回employee对象后。正在调用部门属性,该属性为null。.Department部分在linq生成sql查询并返回employee对象后调用

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


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

第一条语句明确要求使用Employee.Department对象,并且只返回Department对象。所发生的事情是linq构建一个sql查询,该查询内部连接department表

第二条语句查询employee对象。Linq构建一个sql查询,只返回employee对象,因为您没有请求department,所以它不会内部联接department表。返回employee对象后。正在调用部门属性,该属性为null。.Department部分在linq生成sql查询并返回employee对象后调用

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


使用select是最好的方法,因为您只返回您想要的内容。如果出于绩效原因,通常应避免使用include。

您确定
员工.Where(e=>e.EmployeeId==10).部门编译吗?不应该。我不确定它是否编译。我正在使用EF组件在LINQPad内部测试它。Intellisense没有显示任何错误。另外一个(
Employees.Include(“Department”)。其中(e=>e.EmployeeId==10)。Department
)没有意义。您确定那里没有
First
FirstOrDefault
调用吗?您可能不希望Linq为您的实体提取所有可能的关联导航属性,因为这可能会导致大量不需要的数据。第一个“起作用”的原因是您实际上正在选择部门实体。您确定
Employees.Where(e=>e.EmployeeId==10).Department
编译吗?不应该。我不确定它是否编译。我正在使用EF组件在LINQPad内部测试它。Intellisense没有显示任何错误。另外一个(
Employees.Include(“Department”)。其中(e=>e.EmployeeId==10)。Department
)没有意义。您确定那里没有
First
FirstOrDefault
调用吗?您可能不希望Linq为您的实体提取所有可能的关联导航属性,因为这可能会导致大量不需要的数据。第一个“起作用”的原因是您实际上正在选择部门实体。