gpt4 book ai didi

join - LINQ to Entities 连接实例而不是 id 会生成令人讨厌的 SQL

转载 作者:行者123 更新时间:2023-12-02 11:54:08 25 4
gpt4 key购买 nike

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

按 ID

from companyDirector in CompanyDirectors
join contactAddress in ContactAddresses
on companyDirector.ContactAddress.Id equals contactAddress.Id
select new {companyDirector, contactAddress}

生成

FROM  [COMPANY] AS [Extent1]
INNER JOIN [ADDRESS] AS [Extent2] ON [Extent1].[CONTACT_ADDRESS_ID] = [Extent2].[CONTACT_ADDRESS_ID]

按实例

from companyDirector in CompanyDirectors
join contactAddress in ContactAddresses
on companyDirector.ContactAddress equals contactAddress
select new {companyDirector, contactAddress}

生成

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]
)

这对我来说看起来效率很低,迫使你进入 id 路线。为什么它要进行两次左连接,而不介意一次?

最佳答案

我无法说出 ADO.NET 团队的想法或代码。也就是说,我看到两个可能的问题:

  1. 可能,ContractAddresses 中基础表中的 Id 字段(或者可能仅在实体模型中)无法定义为主键。我有点怀疑这就是问题所在,但值得仔细检查。
  2. equals 关键字实际上可能没有一个好的方法来比较连接中两个对象之间的相等性。在快速的网络搜索中,我没有找到 确切 等于 用于比较的内容,但是 this MSDN how-to让我相信涉及 EqualsGetHashCode 方法(即使不涉及复合键)。如果您只是使用默认的 object.Equals 继承方法,Linq 提供程序必须以某种方式找出引用相等性,我想这可能会导致一些奇怪的结果。

不过,我确实喜欢@Craig Stuntz 在他的评论中提出的解决方案。另外,您可能想要获取较长查询的执行计划,看看它是否真的像看起来那么糟糕;查询优化器可能会比代码显示的效果更好。

关于join - LINQ to Entities 连接实例而不是 id 会生成令人讨厌的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com