EF忽略Eager-Loading“Include”语句

时间:2013-12-17 00:47:18

标签: c# linq entity-framework

我已经看到此问题出现again以及againagain。在我阅读答案时,这句话很好地概括了常见的答案:

  

任何手动加入或投影都会改变查询的形状,并且不会使用Include    - Ladislav Mrnka

好的,所以我决定使用DbContext创建一个“hello world”示例EF代码优先项目来测试该语句。我创建了以下查询:

var result = 
    from c in context.Customers.Include(i => i.Addresses)
    from a in c.Accounts
    where a.ID > 4
    select c;

Include()语句应该有效,因为我明显满足要求:(1)我没有使用匿名类型修改投影,(2)我没有手动处理连接。

然而,它不起作用。此查询生成的SQL查询是:

SELECT 
  [Extent1].[ID] AS [ID], 
  [Extent1].[Name] AS [Name]
  FROM  [dbo].[Customers] AS [Extent1]
  INNER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Customer_ID]
  WHERE [Extent2].[ID] > 4

如果我删除Accounts上的连接和过滤,则会正确生成include语句。为什么会这样?

我也很担心EF官方文档似乎没有解释Include()何时被尊重或不被尊重的规则。我只是忽略了什么吗?

1 个答案:

答案 0 :(得分:0)

通过使用from指定第二个c.Accounts语句,您可以“手动处理联接”。

尝试以下查询,其上下文仅基于Customer实体:

from c in context.Customers.Include( i => i.Addresses )
where c.Accounts.Any( a => a.ID > 4 )
select c