2009-10-04 52 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時所期望的。