2009-10-04 94 views
2

我有两个导航属性 - VersionReported和VersionResolved,都存储在表版本中的任务表。当我试图让任务列表与包括这两个属性,我得到太多的加入在SQL(这仅仅是从SQL事件探查器的一部分):使用实体框架生成的SQL中的多个连接

LEFT OUTER JOIN [dbo].[Versions] AS [Extent4] ON [Extent1].[IDVersionReported] = [Extent4].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent5] ON [Extent1].[IDVersionReported] = [Extent5].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent6] ON [Extent1].[IDVersionReported] = [Extent6].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent7] ON [Extent1].[IDVersionReported] = [Extent7].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent8] ON [Extent1].[IDVersionResolved] = [Extent8].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent9] ON [Extent1].[IDVersionResolved] = [Extent9].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent10] ON [Extent1].[IDVersionResolved] = [Extent10].[ID] 
LEFT OUTER JOIN [dbo].[Versions] AS [Extent11] ON [Extent1].[IDVersionResolved] = [Extent11].[ID] 

Extent1是任务表。我知道EntityFramework在两个或多个导航属性导致同一个表时有问题,但是有没有人找到解决方案?

+0

这确实很丑,但它实际上是一个性能问题? SQL Server应该很快执行这个查询,因为数据页面将在缓存中。在EF 4中,SQL生成得到了很大的改进,因为它是值得的。 – 2009-10-05 13:07:36

+0

现在它不是一个性能问题,但它可能是:)现在处理它(如果可能的话)比在生产环境中处理它更好。如果有解决方案,最好是知道它:)它也可能导致其他引擎的问题。 Oracle有1000个列限制,并且通过多次连接,您可以轻松实现。 – LukLed 2009-10-05 13:29:32

回答

2

大约2个月前我加入了EF项目,我们也注意到了这个问题。

我想最简单的(也是最好的)解决方案是创建一个视图,它执行所有JOIN魔术,并将该视图映射到EF中。

另一方面,对于每个性能问题需要视图可能不是我们开始使用EF时所期望的。