EF(版本4.3.1)为contains子句中的每个项创建多个左连接:
这是linq查询
var result = from claim in Dbset.Where(c =>
productIds.Contains(c.Member.Campaign.ProductId)
&& (c.ClaimAmount.HasValue && c.ClaimAmount.Value < 0.00M))
Claim是根实体和Member,Member.Campaign是导航属性。 productIds包含产品列表,当EF创建Sql查询时,似乎变量productIds中的每个产品都有一个左连接,并且还有带OR条件的大型where子句而不是简单的IN子句。
这是生成的sql查询的FROM和WHERE子句:
FROM [dbo].[Claim] AS [Extent1]
INNER JOIN [dbo].[Members] AS [Extent2] ON [Extent1].[MemberId] = [Extent2].[MemberId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent3] ON [Extent2].[CampaignId] = [Extent3].[CampaignId]
LEFT OUTER JOIN [dbo].[Members] AS [Extent4] ON [Extent1].[MemberId] = [Extent4].[MemberId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent5] ON [Extent4].[CampaignId] = [Extent5].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent6] ON [Extent4].[CampaignId] = [Extent6].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent7] ON [Extent4].[CampaignId] = [Extent7].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent8] ON [Extent4].[CampaignId] = [Extent8].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent9] ON [Extent4].[CampaignId] = [Extent9].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent10] ON [Extent4].[CampaignId] = [Extent10].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent11] ON [Extent4].[CampaignId] = [Extent11].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent12] ON [Extent4].[CampaignId] = [Extent12].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent13] ON [Extent4].[CampaignId] = [Extent13].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent14] ON [Extent4].[CampaignId] = [Extent14].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent15] ON [Extent4].[CampaignId] = [Extent15].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent16] ON [Extent4].[CampaignId] = [Extent16].[CampaignId]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent17] ON [Extent4].[CampaignId] = [Extent17].[CampaignId]
WHERE ([Extent1].[ClaimAmount] IS NOT NULL) AND ([Extent1].[ClaimAmount] < 0.00) ) AS [Filter1]
LEFT OUTER JOIN [dbo].[Campaign] AS [Extent18] ON [Filter1].[CampaignId1] = [Extent18].[CampaignId]
WHERE [Filter1].[ProductId1] = 2 OR [Filter1].[ProductId2] = 3 OR [Filter1].[ProductId3] = 4 OR [Filter1].[ProductId4] = 5 OR [Filter1].[ProductId5] = 6
OR [Filter1].[ProductId6] = 7 OR [Filter1].[ProductId7] = 8 OR [Filter1].[ProductId8] = 9 OR [Filter1].[ProductId9] = 10 OR
[Filter1].[ProductId10] = 11 OR [Filter1].[ProductId11] = 12 OR [Filter1].[ProductId12] = 13 OR [Filter1].[ProductId13] = 14 OR
[Filter1].[ProductId14] = 15 OR [Extent18].[ProductId] = 16
为什么EF为这个简单的lambda创建了如此复杂的查询?