代码之家  ›  专栏  ›  技术社区  ›  LukLed

使用实体框架生成的SQL中的多个联接

  •  2
  • LukLed  · 技术社区  · 15 年前

    我有两个导航属性的tasks表——versionreported和versionresolved,都存储在表版本中。当我试图获取包含这两个属性的任务列表时,我在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在两个或多个导航属性指向同一个表时存在问题,但是否有人找到了解决方案?

    1 回复  |  直到 15 年前
        1
  •  2
  •   devio    15 年前

    大约2个月前我参加了一个英孚项目,我们也注意到了这个问题。

    我想最简单(也是最好的执行)的解决方案是创建一个执行所有连接魔法的视图,并在ef中映射该视图。

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