实体框架多对多关系包括极其缓慢

时间:2010-12-25 18:06:36

标签: c# .net sql entity-framework many-to-many

我有一个Entity Framework 4模型,其中2个实体包含多对多关系,因此有3个表,[Q],[P]和[Q2P] - 交叉表。运行代码如:

context.Q.Include("P");

长时间等待的结果(我等了5分钟然后中止了)。然后我检查了SQL生成并发现了这个:

SELECT *
FROM ( SELECT *
    FROM  [Q] AS [Extent1]
    LEFT OUTER JOIN  (SELECT *, CASE WHEN ([Join1].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
        FROM  [Q_P] AS [Extent2]
        INNER JOIN [P] AS [Extent3] ON [Extent3].[Id] = [Extent2].[Id] ) AS [Join1] ON [Extent1].[Id] = [Join1].[Id]
)  AS [Project1]
ORDER BY [Project1].[Id] ASC, [Project1].[C2] ASC

我无法掩饰我的惊讶,WTF是这个吗?通常的多对多SQL查询

select * from [q2p]
join [q] on qId=q.Id
join [p] on pId=p.Id

执行时间不到1毫秒,而EF查询将永久执行。

2 个答案:

答案 0 :(得分:3)

是的,这不是一个需要很长时间的秘密,请在大约一年前开设的connection投票。

然而,5分钟是绝对不应该采取的。

尝试将执行与查询生成分开,并使用ToTraceString查看确定查询生成时间需要多长时间。

在当前版本中,急切加载并不是很重要,他们表示他们计划在未来降低性能成本。

无论如何,你可以做的是使用存储过程或创建自己的ObjectQueries。

请参阅:
  - http://msdn.microsoft.com/en-us/library/bb896241.aspx
  - http://msdn.microsoft.com/en-us/library/bb896238.aspx

答案 1 :(得分:2)

我已切换到Nhibernate。