C# 实体框架DbSet.Where()为contains用法创建多个左连接

C# 实体框架DbSet.Where()为contains用法创建多个左连接,c#,entity-framework,linq,C#,Entity Framework,Linq,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)) var result=来自Dbset中的索赔。其中(c

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))
var result=来自Dbset中的索赔。其中(c=>
ProductId.Contains(c.Member.Campaign.ProductId)
&&(c.claimermount.HasValue和c.claimermount.Value<0.00M))
声明是根实体,成员、成员。活动是导航属性。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
[dbo].[Claim]中的
作为[Extent1]
将[dbo].[Members]作为[Extent1].[MemberId]=[Extent2].[MemberId]上的[Extent2]进行内部联接
[Extent2].[CampaignId]=[Extent3].[CampaignId]上的[dbo].[Campaign]作为[Extent3]左外部联接
在[Extent1].[MemberId]=[Extent4].[MemberId]上作为[Extent4]左外部联接[dbo].[Members]
[Extent4].[CampaignId]=[Extent5].[CampaignId]上的[Extent5]左外部联接[dbo].[Campaign]为[Extent5]
[Extent4].[CampaignId]=[Extent6].[CampaignId]上的[Extent6]左外部联接[dbo].[Campaign]为[Extent6]
[Extent4].[CampaignId]=[Extent7].[CampaignId]上的[dbo].[Campaign]作为[Extent7]左外部联接
在[Extent4].[CampaignId]=[Extent8].[CampaignId]上将[dbo].[Campaign]作为[Extent8]左外部联接
在[Extent4].[CampaignId]=[Extent9].[CampaignId]上将[dbo].[Campaign]作为[Extent9]左外部联接
在[Extent4].[CampaignId]=[Extent10].[CampaignId]上将[dbo].[Campaign]作为[Extent10]左外部联接
在[Extent4].[CampaignId]=[Extent11].[CampaignId]上将[dbo].[Campaign]作为[Extent11]左外部联接
在[Extent4].[CampaignId]=[Extent12].[CampaignId]上将[dbo].[Campaign]作为[Extent12]左外部联接
在[Extent4].[CampaignId]=[Extent13].[CampaignId]上将[dbo].[Campaign]作为[Extent13]左外部联接
在[Extent4].[CampaignId]=[Extent14].[CampaignId]上将[dbo].[Campaign]作为[Extent14]左外部联接
在[Extent4].[CampaignId]=[Extent15].[CampaignId]上将[dbo].[Campaign]作为[Extent15]左外部联接
在[Extent4].[CampaignId]=[Extent16].[CampaignId]上将[dbo].[Campaign]作为[Extent16]左外部联接
在[Extent4].[CampaignId]=[Extent17].[CampaignId]上将[dbo].[Campaign]作为[Extent17]左外部联接
其中([Extent1].[claimermount]不为NULL)和([Extent1].[claimermount]<0.00))作为[Filter1]
左外部联接[dbo].[Campaign]为[Filter1].[CampaignId1]=[Extent18].[CampaignId]上的[Extent18]
其中[Filter1].[ProductId1]=2或[Filter1].[ProductId2]=3或[Filter1].[ProductId3]=4或[Filter1].[ProductId4]=5或[Filter1].[ProductId5]=6
或[Filter1].[ProductId6]=7或[Filter1].[ProductId7]=8或[Filter1].[ProductId8]=9或[Filter1].[ProductId9]=10或
[Filter1].[ProductId10]=11或[Filter1].[ProductId11]=12或[Filter1].[ProductId12]=13或[Filter1].[ProductId13]=14或
[Filter1].[ProductId14]=15或[Extent18].[ProductId]=16

你知道为什么EF会为这个简单的lambda创建如此复杂的查询吗?

如果你能用EF 6.x重复这一点(作为mcve),那就更重要了。没有人关心过时产品的效率/工作方式。查询应具有select。Try:var result=Dbset.Where(c=>productIds.Contains(c.Member.Campaign.ProductId)&&&(c.claimermount.HasValue&&c.claimermount.Value<0.00M))如果您可以用EF 6.x重复这一点(作为一个mcve),那么它将更加相关。没有人关心过时产品的效率/工作方式。查询应具有select。Try:var result=Dbset.Where(c=>productIds.Contains(c.Member.Campaign.ProductId)&&&(c.claimermount.HasValue&&c.claimermount.Value<0.00M))