【问题标题】:Entity Framework 5 on framework 4, contains and multiple outer joins with same table框架 4 上的实体框架 5,包含同一个表的多个外连接
【发布时间】:2013-08-07 14:18:16
【问题描述】:

在 Windows 2008 R2 服务器上部署时,我的应用程序遇到了一个非常奇怪的问题。

鉴于这个非常简单的 LINQ sn-p:

return From
    invoice In Me.Invoices
Where
    loggedCustomerID.Contains(invoice.Contract.CustomerID)
Order By
    invoice.Date Descending

应用程序可以工作,但在某些情况下(在客户服务器上),生成的 T-SQL 很奇怪:

 SELECT 
    [Extent1].[ContractID] AS [ContractID], ...
 FROM
    [dbo].[Invoice] AS [Extent1]
    INNER JOIN [dbo].[Contract] AS [Extent2] ON 
             [Extent1].[ContractID] = [Extent2].[ContractID]
    LEFT OUTER JOIN [dbo].[Contract] AS [Extent3] ON 
             [Extent1].[ContractID] = [Extent3].[ContractID]

 WHERE 
      [Extent2].[CustomerID] = 482283 
   OR [Extent3].[CustomerID] IN (498565,482282,498564,498566)
  • 表格链接多次 (?)
  • IN 语句被分解为多个 T-SQL 条件,而不是单个 IN 语句

显然,相同的包在我的系统上运行良好,生成正确查询,无需多次链接同一个表并且只创建一个IN 语句。

我使用的是 EF 5.0,但与 Framework 4.0 兼容(因此程序集显示版本 4.4)。这是这个问题的根本原因吗?

这里有什么问题?

看起来行为与此有关? Too Many Left Outer Joins in Entity Framework 4?

【问题讨论】:

    标签: entity-framework-5


    【解决方案1】:

    我在 NHibernate 中遇到过类似的行为,也许你会发现任何相似之处。

    我们得到了简单的parent -> children 关系。关键是关系是双向的,因此父级引用了所有子级,并且每个子级都有对父级的引用。

    NHibernate 支持我关闭的延迟获取。因此,一旦我决定获取整个聚合,它就会产生有趣的查询,我的意思是父母和所有孩子。

    类似:

    select ... from parent ... left join ... children ... left join parent

    由于 Nhibernate 在底层使用一级缓存,它无法自动发现那些父实例是相等的,因为在查询执行时父缓存是空的。

    稍后在解析生成的数据库数据集时,NHibernate 发现父实体具有相同的主标识符并仅返回一个真实实例。

    【讨论】:

    • 嗨,马丁,感谢您的回答!我将尝试删除延迟加载选项,看看会发生什么,但奇怪的是在我的机器上(.NET Framework 4.5 vs 4.0?)一切运行良好,它在 2003 R2 Box 和 2008 R2 盒子,我有这种奇怪的行为......我将尝试在 2008 盒子上升级到 .NET 4.5,因为不支持 2003 并回来提供一些反馈!
    【解决方案2】:

    最后我能够进行一些测试。似乎 EF T-SQL 生成很大程度上取决于底层框架。事实上,只要将框架升级到 4.5 就可以解决上述问题。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      相关资源
      最近更新 更多