在Windows 2008 R2服务器上部署时,我的应用程序出现了一个非常奇怪的问题。
鉴于这个非常简单的LINQ片段:
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)。这是这个问题的根本原因吗?
这里可能有什么问题?
答案 0 :(得分:1)
我在NHibernate中遇到了类似的行为,也许你发现有任何相似之处。
我们变得简单parent
- > children
关系。关键是该关系是双向的,所以父母引用了所有孩子,并且他们每个人都引用了父母。
NHibernate支持我关闭的延迟抓取。因此,一旦我决定获取整个聚合,它就产生了有趣的查询,我的意思是所有孩子的父母。
类似的东西:
select ... from parent ... left join ... children ... left join parent
由于Nhibernate使用了第一级缓存,因此无法自动发现这些父实例是相同的,因为在查询执行时父级的缓存是空的。
稍后在解析生成的数据库数据集时,NHibernate发现父实体具有相同的主标识符,并且只返回一个实例。
答案 1 :(得分:0)
最后我能够进行一些测试。似乎EF T-SQL生成在很大程度上取决于不良框架。实际上,只需将框架升级到4.5即可解决上述问题。