2009-10-04 7 views
2

J'ai une table de tâches avec deux propriétés de navigation - VersionReported et VersionResolved, toutes deux stockées dans des versions de table. Lorsque je tente d'obtenir la liste des tâches avec les deux propriétés incluses, je reçois trop de jointures dans SQL (ce qui est seulement une partie de sql de profileur):Plusieurs jointures dans SQL générées avec Entity Framework

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 est la table des tâches. Je sais que EntityFramework a un problème lorsque deux propriétés de navigation ou plus mènent à la même table, mais quelqu'un a-t-il trouvé une solution?

+0

C'est en effet moche, mais est-ce vraiment un problème de performance? SQL Server doit exécuter cette requête très rapidement, car les pages de données seront dans le cache. La génération SQL est considérablement améliorée dans EF 4, pour ce que ça vaut. –

+0

À l'heure actuelle, ce n'est pas un problème de performance, mais cela peut être le cas :) Il est préférable de le gérer dès maintenant (si c'est possible) plutôt que d'y faire face dans un environnement de production. S'il y a une solution, il est préférable de le savoir :) Cela peut aussi causer des problèmes sur d'autres moteurs. Oracle a une limite de 1000 colonnes et en multipliant les jointures, vous pouvez facilement l'atteindre. – LukLed

Répondre

2

J'ai rejoint un projet EF il y a environ 2 mois, et nous avons également remarqué ce problème.

Je suppose que la solution la plus simple (et la plus performante) consiste à créer une vue qui fait toute la magie JOIN et à mapper cette vue dans EF. D'autre part, exiger des vues pour chaque problème de performances n'est probablement pas ce que nous attendions lorsque nous avons commencé avec EF.

Questions connexes