.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は、単一の結合を実行するだけですか?
ありがとうございます!
アンソニー。あなたは「熱心な負荷」次のコードを使用して、顧客のオプションテーブルができ
Iこれが悪いと言う前に実行計画をチェックしてください。プランのコンパイルは理解でき、CustomerUserFieldを1回だけ照会します。 100%は確かではありませんが、このようなクエリは実際にはかなりうまく最適化されています。 – jfar
少なくとも、SQL Server 2008 R2以前では、それは悪いです。 SQL Serverは余分な結合を最適化しません。 –