0
我有一個.NET關係的實體數據模型,以便我不需要在我的LINQ查詢中手動連接實體。 LINQ查詢下面引用另一個表CustomerUserField:Linq 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只執行單個連接?
在此先感謝!
安東尼。
我在說這是壞的之前,檢查執行計劃。計劃編譯可能會理解並只查詢一次CustomerUserField。不是100%肯定的,但我已經看到這樣的事情,實際上優化很好。 – jfar 2009-04-20 05:58:59
這至少在SQL Server 2008 R2和更早的版本上是不好的。 SQL Server不會優化那些多餘的連接。 – 2011-08-09 14:59:04