2013-08-07 27 views
1

在Windows 2008 R2服務器上部署時,我的應用程序出現非常奇怪的問題。框架4上的實體框架5,包含和多個具有相同表格的外部聯接

鑑於這種非常簡單的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)。這是這個問題的根源嗎?

這裏有什麼問題?

看起來行爲與此有關? Too Many Left Outer Joins in Entity Framework 4?

回答

0

最後我能夠進行一些測試。看起來,EF T-SQL的生成在很大程度上依賴於未定義的框架。實際上,只需將框架升級到4.5即可解決上述問題。

1

我遇到過類似NHibernate的行爲,也許你會發現任何相似之處。

我們得到了簡單的parentchildren的關係。關鍵是該關係是雙向的,所以父母引用了所有孩子,並且他們每個人都有參照回到父母。

NHibernate支持我關閉的延遲讀取。因此,一旦我決定取得整個聚集,它就產生了有趣的查詢,我的意思是所有孩子的父母。

喜歡的東西:

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

例如NHibernate使用一級緩存引擎蓋下,它無法自動發現,那些父母實例相等父的緩存在時間空查詢執行。

在解析生成的數據庫數據集的過程中,NHibernate發現父實體具有相同的主標識符,並且只返回一個實例。

+0

嗨馬丁,謝謝你的回答!我將嘗試刪除延遲加載選項並查看會發生什麼,但是在我的機器上(.NET Framework 4.5 vs 4.0?)都運行正常,它在2003 R2 Box以及2008上R2的盒子,我有這種奇怪的行爲...我將嘗試升級到2008年的盒子上的.NET 4.5,因爲在2003年不支持,並回來一些反饋! – adrianot75