我有一个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查询将永久执行。
答案 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。