实体框架左连接多个表创建内连接

时间:2015-01-09 22:07:00

标签: c# linq entity-framework entity-framework-6

我试图创建一个将四个表连接在一起的查询,但只保证其中一个表存在。我以前在EF中创建左连接是成功的,但从来没有多个连接。这是查询:

   var details = (from planInfo in context.PlanInfo
                 join templateRec in context.ProductTemplates
                    on planInfo.TemplateId equals templateRec.TemplateId into templateGroup
                 from template in templateGroup.DefaultIfEmpty()
                 join profileRec in context.CustomerProfiles
                    on planInfo.ProfileId equals profileRec.ProfileId into profileGroup
                 from profile in profileGroup.DefaultIfEmpty()
                 join territoryRec in context.Territories
                    on planInfo.TerritoryId equals territoryRec.TerritoryId into territoryGroup
                 from territory in territoryGroup.DefaultIfEmpty()
                 where planInfo.ActiveStatus
                 && planInfo.PlanId == plan.PlanId
                 select new
                 {
                    PlanId = planInfo.PlanId,
                    TemplateId = planInfo.TemplateId,
                    TemplateGridId = planInfo.TemplateId,
                    ProfileRec = (profile == null ?
                    new
                    {
                       ProfileId = 0,
                       ProfileGridId = 0,
                       Description = string.Empty
                    } :
                    new
                    {
                       ProfileId = profile.ProfileId,
                       ProfileGridId = profile.ProfileId,
                       Description = profile.Description
                    }),
                    ProfileId = (profile == null ? 0 : profile.ProfileId),
                    TerritoryRec = (territory == null ?
                    new
                    {
                       TerritoryId = 0,
                       TerritoryGridId = 0,
                       Description = string.Empty
                    } :
                    new
                    {
                       TerritoryId = territory.TerritoryId,
                       TerritoryGridId = territory.TerritoryId,
                       Description = territory.Description
                    }),
                    TerritoryId = (territory == null ? 0 : territory.TerritoryId),
                    Description = (template == null ? string.Empty: template.Description),
                    TemplateEffectiveDate = planInfo.TemplateEffectiveDate,
                    TemplateExpiryDate = planInfo.TemplateExpiryDate,
                    MinVolume = planInfo.MinVolume,
                    MaxVolume = planInfo.MaxVolume,
                    AccrualPercent = planInfo.AccrualPercent,
                    AccrualPercentNatl = planInfo.AccrualPercentNatl,
                    EffectiveDate = planInfo.EffectiveDate,
                    ExpiryDate = planInfo.ExpiryDate
                 }).ToList();

这是它生成的SQL。无论我做什么,我总是得到几个INNER JOIN,然后是LEFT JOIN,当我想要的只是LEFT JOIN

SELECT 
    [Filter1].[PlanId] AS [PlanId], 
    [Filter1].[TemplateId1] AS [TemplateId], 
    [Filter1].[ProfileId1] AS [ProfileId], 
    [Filter1].[Description1] AS [Description], 
    CASE WHEN ([Extent4].[TerritoryId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
    [Extent4].[TerritoryId] AS [TerritoryId], 
    [Extent4].[Description] AS [Description1], 
    CASE WHEN ([Extent4].[TerritoryId] IS NULL) THEN 0 ELSE [Extent4].[TerritoryId] END AS [C2], 
    [Filter1].[Description2] AS [Description2], 
    [Filter1].[TemplateEffectiveDate] AS [TemplateEffectiveDate], 
    [Filter1].[TemplateExpiryDate] AS [TemplateExpiryDate], 
    [Filter1].[MinVolume] AS [MinVolume], 
    [Filter1].[MaxVolume] AS [MaxVolume], 
    [Filter1].[AccrualPercent] AS [AccrualPercent], 
    [Filter1].[AccrualPercentNatl] AS [AccrualPercentNatl], 
    [Filter1].[EffectiveDate] AS [EffectiveDate], 
    [Filter1].[ExpiryDate] AS [ExpiryDate]
    FROM   (SELECT [Extent1].[PlanId] AS [PlanId], [Extent1].[TemplateId] AS [TemplateId1], [Extent1].[TerritoryId] AS [TerritoryId], [Extent1].[TemplateEffectiveDate] AS [TemplateEffectiveDate], [Extent1].[TemplateExpiryDate] AS [TemplateExpiryDate], [Extent1].[MinVolume] AS [MinVolume], [Extent1].[MaxVolume] AS [MaxVolume], [Extent1].[AccrualPercent] AS [AccrualPercent], [Extent1].[AccrualPercentNatl] AS [AccrualPercentNatl], [Extent1].[EffectiveDate] AS [EffectiveDate], [Extent1].[ExpiryDate] AS [ExpiryDate], [Extent2].[Description] AS [Description2], [Extent3].[ProfileId] AS [ProfileId1], [Extent3].[Description] AS [Description1]
        FROM   [dbo].[PlanInfo] AS [Extent1]
        INNER JOIN [dbo].[ProductTemplates] AS [Extent2] ON [Extent1].[TemplateId] = [Extent2].[TemplateId]
        INNER JOIN [dbo].[CustomerProfiles] AS [Extent3] ON [Extent1].[ProfileId] = [Extent3].[ProfileId]
        WHERE [Extent1].[ActiveStatus] = 1 ) AS [Filter1]
    LEFT OUTER JOIN [dbo].[Territories] AS [Extent4] ON [Filter1].[TerritoryId] = [Extent4].[TerritoryId]
    WHERE [Filter1].[PlanId] = '12345'

希望有人可以指出我在这里做错了什么。谢谢!

1 个答案:

答案 0 :(得分:0)

INNER JOINS代表所需的n:1关联。如果您有导航属性,则连接将是对另一个必需实体的引用,而不是对集合的引用。 EF从数据模型中知道OUTER JOIN在此处没有效果,因此它会生成INNER JOIN