LINQ to Entities加入实例而不是id会生成令人讨厌的SQL

jen*_*ent 14 linq-to-entities join

任何人都可以解释为什么实体连接而不是id生成一些非常丑陋的SQL实际上在概念上它做你认为是同样的事情?例如

通过id

from companyDirector in CompanyDirectors
join contactAddress in ContactAddresses
  on companyDirector.ContactAddress.Id equals contactAddress.Id
select new {companyDirector, contactAddress}
Run Code Online (Sandbox Code Playgroud)

生成

FROM  [COMPANY] AS [Extent1]
    INNER JOIN [ADDRESS] AS [Extent2] ON [Extent1].[CONTACT_ADDRESS_ID] = [Extent2].[CONTACT_ADDRESS_ID]
Run Code Online (Sandbox Code Playgroud)

通过实例

from companyDirector in CompanyDirectors
join contactAddress in ContactAddresses
  on companyDirector.ContactAddress equals contactAddress
select new {companyDirector, contactAddress}
Run Code Online (Sandbox Code Playgroud)

生成

FROM  [COMPANY] AS [Extent1]
INNER JOIN [ADDRESS] AS [Extent2] ON  EXISTS (SELECT 
    1 AS [C1]
    FROM    ( SELECT 1 AS X ) AS [SingleRowTable1]
    LEFT OUTER JOIN  (SELECT 
        [Extent3].[CONTACT_ADDRESS_ID] AS [CONTACT_ADDRESS_ID]
        FROM [ADDRESS] AS [Extent3]
        WHERE [Extent1].[CONTACT_ADDRESS_ID] = [Extent3].[CONTACT_ADDRESS_ID] ) AS [Project1] ON 1 = 1
    LEFT OUTER JOIN  (SELECT 
        [Extent4].[CONTACT_ADDRESS_ID] AS [CONTACT_ADDRESS_ID]
        FROM [ADDRESS] AS [Extent4]
        WHERE [Extent1].[CONTACT_ADDRESS_ID] = [Extent4].[CONTACT_ADDRESS_ID] ) AS [Project2] ON 1 = 1
    WHERE [Project1].[CONTACT_ADDRESS_ID] = [Extent2].[CONTACT_ADDRESS_ID]
)
Run Code Online (Sandbox Code Playgroud)

这对我来说效率很低,迫使你进入id路线.为什么它左右连接两次,没关系一次?

jen*_*ent 0

最后,对我来说,EF 仍然缺乏在广阔的世界中发挥作用所需的成熟度和功能。所以我放弃了它,转而使用 NHibernate,它生成简单漂亮且优化的 SQL。