2009-04-20 18 views
0

.NETエンティティデータモデルに関係を設定して、LINQクエリのエンティティを手動で結合する必要はありません。参考文献以下のLINQクエリ別のテーブルCustomerUserField生成されたSQLのLinqへの過剰な結合

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 
}; 

それはしかし、生成されたSQLが別々の左外側が参照されるテーブル内のすべての列に加わる作成し、C#でのきちんとした素敵な&を探します:

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

Iこれが悪いと言う前に実行計画をチェックしてください。プランのコンパイルは理解でき、CustomerUserFieldを1回だけ照会します。 100%は確かではありませんが、このようなクエリは実際にはかなりうまく最適化されています。 – jfar

+0

少なくとも、SQL Server 2008 R2以前では、それは悪いです。 SQL Serverは余分な結合を最適化しません。 –

答えて

0

:同時に、それはテーブルをロードするよう

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

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

あなたが参加することを意味しなければならないだけで、一度実行される

+1

LoadWithはLINQ to SQL用です。 LINQ to EntitiesにObjectQuery.Includeを使用します。 –

関連する問題