2009-04-20 51 views
0

我有一個.NET關係的實體數據模型,以便我不需要在我的LINQ查詢中手動連接實體。 LINQ查詢下面引用另一個表CustomerUserFieldLinq to Entities過度連接生成的SQL

from c in Customer.GetCustomer(this.ClientId, intRecordId) 
select new 
{ 
    c.TitleId, 
    c.FirstName, 
    c.LastName, 
    c.Phone, 
    c.MobilePhone, 
    c.Fax, 
    c.EmailAddress, 
    c.CustomerUserField.Text1, 
    c.CustomerUserField.Text2, 
    c.CustomerUserField.Text3, 
    c.CustomerUserField.Text4, 
    c.CustomerUserField.Text5 
}; 

它看起來不錯&在C#整齊,但生成的SQL創建一個獨立的左外連接在引用表中的每一列:

SELECT 
[Limit1].[C1] AS [C1], 
[Limit1].[TitleId] AS [TitleId], 
... 
FROM         
    [dbo].[Customer] AS [Extent1] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[CustomerId] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent9] ON [Extent2].[CustomerUserFieldId] = [Extent9].[CustomerUserFieldId] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent10] ON [Extent2].[CustomerUserFieldId] = [Extent10].[CustomerUserFieldId] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent11] ON [Extent2].[CustomerUserFieldId] = [Extent11].[CustomerUserFieldId] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent12] ON [Extent2].[CustomerUserFieldId] = [Extent12].[CustomerUserFieldId] 
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent13] ON [Extent2].[CustomerUserFieldId] = [Extent13].[CustomerUserFieldId]... 

該SQL非常慢,因爲只需要1個左外連接。任何想法如何我可以改變我的LINQ只執行單個連接?

在此先感謝!

安東尼。

+1

我在說這是壞的之前,檢查執行計劃。計劃編譯可能會理解並只查詢一次CustomerUserField。不是100%肯定的,但我已經看到這樣的事情,實際上優化很好。 – jfar 2009-04-20 05:58:59

+0

這至少在SQL Server 2008 R2和更早的版本上是不好的。 SQL Server不會優化那些多餘的連接。 – 2011-08-09 14:59:04

回答

0

,你可以用下面的代碼「渴望負荷」你的客戶選擇表:

DataLoadOptions options = new DataLoadOptions(); 
options.LoadWith<Customer>(c => c.CustomerUserField); 

using (ToDoDataContext context = new ToDoDataContext()) 
{ 
    context.LoadOptions = options; 
    //Your code goes here 
} 

這應該意味着你的加入只執行一次,因爲它加載表的同時