.Include()导致一个巨大的联合查询而不是我的所有孩子都填充?

时间:2013-03-18 20:11:53

标签: c# linq entity-framework

可能是什么问题?结果.SubAreas 始终 null。 我整个下午都在审查我的所有数据库约束,代码,pocos,映射,数据注释。 results.ToString()查询显示它正在加入子区域,当我在Management Studio中运行查询时它返回行。但它看起来很奇怪。在查询之后,我已经包含了poco定义。

查询

var results = (from b in _context.Buildings
               .Include("SubAreas")
               .Include("ExtraFeatures")
               .Include("StructuralElements")
               where b.STRAP == strap && b.NUM == bld_num
               select b).FirstOrDefault();

SQL声明

SELECT 
[UnionAll2].[C2] AS [C1], 
[UnionAll2].[C3] AS [C2], 
[UnionAll2].[C4] AS [C3], 
[UnionAll2].[C5] AS [C4], 
[UnionAll2].[C6] AS [C5], 
[UnionAll2].[C7] AS [C6], 
[UnionAll2].[C8] AS [C7], 
[UnionAll2].[C9] AS [C8], 
[UnionAll2].[C10] AS [C9], 
[UnionAll2].[C1] AS [C10], 
[UnionAll2].[C11] AS [C11], 
[UnionAll2].[C12] AS [C12], 
[UnionAll2].[C13] AS [C13], 
[UnionAll2].[C14] AS [C14], 
[UnionAll2].[C15] AS [C15], 
[UnionAll2].[C16] AS [C16], 
[UnionAll2].[C17] AS [C17], 
[UnionAll2].[C18] AS [C18], 
[UnionAll2].[C19] AS [C19], 
[UnionAll2].[C20] AS [C20], 
[UnionAll2].[C21] AS [C21], 
[UnionAll2].[C22] AS [C22], 
[UnionAll2].[C23] AS [C23], 
[UnionAll2].[C24] AS [C24], 
[UnionAll2].[C25] AS [C25], 
[UnionAll2].[C26] AS [C26], 
[UnionAll2].[C27] AS [C27], 
[UnionAll2].[C28] AS [C28], 
[UnionAll2].[C29] AS [C29], 
[UnionAll2].[C30] AS [C30], 
[UnionAll2].[C31] AS [C31], 
[UnionAll2].[C32] AS [C32], 
[UnionAll2].[C33] AS [C33], 
[UnionAll2].[C34] AS [C34], 
[UnionAll2].[C35] AS [C35]
FROM  (SELECT 
    [UnionAll1].[C1] AS [C1], 
    [UnionAll1].[NUM] AS [C2], 
    [UnionAll1].[STRAP] AS [C3], 
    [UnionAll1].[NUM1] AS [C4], 
    [UnionAll1].[SITUS] AS [C5], 
    [UnionAll1].[TYPE] AS [C6], 
    [UnionAll1].[STYLE] AS [C7], 
    [UnionAll1].[YEAR_BUILT] AS [C8], 
    [UnionAll1].[GROSS_AREA] AS [C9], 
    [UnionAll1].[LIVING_AREA] AS [C10], 
    [UnionAll1].[STRAP1] AS [C11], 
    [UnionAll1].[BUILDING_NUM] AS [C12], 
    [UnionAll1].[SAR_LN_NUM] AS [C13], 
    [UnionAll1].[DSCR] AS [C14], 
    [UnionAll1].[GROSS_AREA1] AS [C15], 
    [UnionAll1].[VALUE] AS [C16], 
    [UnionAll1].[STRAP2] AS [C17], 
    [UnionAll1].[BUILDING_NUM1] AS [C18], 
    [UnionAll1].[C2] AS [C19], 
    [UnionAll1].[C3] AS [C20], 
    [UnionAll1].[C4] AS [C21], 
    [UnionAll1].[C5] AS [C22], 
    [UnionAll1].[C6] AS [C23], 
    [UnionAll1].[C7] AS [C24], 
    [UnionAll1].[C8] AS [C25], 
    [UnionAll1].[C9] AS [C26], 
    [UnionAll1].[C10] AS [C27], 
    [UnionAll1].[C11] AS [C28], 
    [UnionAll1].[C12] AS [C29], 
    [UnionAll1].[C13] AS [C30], 
    [UnionAll1].[C14] AS [C31], 
    [UnionAll1].[C15] AS [C32], 
    [UnionAll1].[C16] AS [C33], 
    [UnionAll1].[C17] AS [C34], 
    [UnionAll1].[C18] AS [C35]
    FROM  (SELECT 
        CASE WHEN ([Extent2].[BUILDING_NUM] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
        [Extent1].[NUM] AS [NUM], 
        [Extent1].[STRAP] AS [STRAP], 
        [Extent1].[NUM] AS [NUM1], 
        [Extent1].[SITUS] AS [SITUS], 
        [Extent1].[TYPE] AS [TYPE], 
        [Extent1].[STYLE] AS [STYLE], 
        [Extent1].[YEAR_BUILT] AS [YEAR_BUILT], 
        [Extent1].[GROSS_AREA] AS [GROSS_AREA], 
        [Extent1].[LIVING_AREA] AS [LIVING_AREA], 
        [Extent2].[STRAP] AS [STRAP1], 
        [Extent2].[BUILDING_NUM] AS [BUILDING_NUM], 
        [Extent2].[SAR_LN_NUM] AS [SAR_LN_NUM], 
        [Extent2].[DSCR] AS [DSCR], 
        [Extent2].[GROSS_AREA] AS [GROSS_AREA1], 
        [Extent2].[VALUE] AS [VALUE], 
        [Extent2].[STRAP] AS [STRAP2], 
        [Extent2].[BUILDING_NUM] AS [BUILDING_NUM1], 
        CAST(NULL AS varchar(1)) AS [C2], 
        CAST(NULL AS int) AS [C3], 
        CAST(NULL AS int) AS [C4], 
        CAST(NULL AS varchar(1)) AS [C5], 
        CAST(NULL AS decimal(18,2)) AS [C6], 
        CAST(NULL AS decimal(18,2)) AS [C7], 
        CAST(NULL AS int) AS [C8], 
        CAST(NULL AS varchar(1)) AS [C9], 
        CAST(NULL AS varchar(1)) AS [C10], 
        CAST(NULL AS varchar(1)) AS [C11], 
        CAST(NULL AS int) AS [C12], 
        CAST(NULL AS int) AS [C13], 
        CAST(NULL AS varchar(1)) AS [C14], 
        CAST(NULL AS varchar(1)) AS [C15], 
        CAST(NULL AS varchar(1)) AS [C16], 
        CAST(NULL AS varchar(1)) AS [C17], 
        CAST(NULL AS int) AS [C18]
        FROM  [dbo].[Buildings] AS [Extent1]
        LEFT OUTER JOIN [dbo].[SUB_AREAS] AS [Extent2] ON ([Extent1].[STRAP] = [Extent2].[STRAP]) AND ([Extent1].[NUM] = [Extent2].[BUILDING_NUM])
        WHERE ([Extent1].[STRAP] = '0001020003') AND ([Extent1].[NUM] = 1)
    UNION ALL
        SELECT 
        2 AS [C1], 
        [Extent3].[NUM] AS [NUM], 
        [Extent3].[STRAP] AS [STRAP], 
        [Extent3].[NUM] AS [NUM1], 
        [Extent3].[SITUS] AS [SITUS], 
        [Extent3].[TYPE] AS [TYPE], 
        [Extent3].[STYLE] AS [STYLE], 
        [Extent3].[YEAR_BUILT] AS [YEAR_BUILT], 
        [Extent3].[GROSS_AREA] AS [GROSS_AREA], 
        [Extent3].[LIVING_AREA] AS [LIVING_AREA], 
        CAST(NULL AS varchar(1)) AS [C2], 
        CAST(NULL AS int) AS [C3], 
        CAST(NULL AS int) AS [C4], 
        CAST(NULL AS varchar(1)) AS [C5], 
        CAST(NULL AS int) AS [C6], 
        CAST(NULL AS int) AS [C7], 
        CAST(NULL AS varchar(1)) AS [C8], 
        CAST(NULL AS int) AS [C9], 
        [Extent4].[STRAP] AS [STRAP1], 
        [Extent4].[LN_NUM] AS [LN_NUM], 
        [Extent4].[BUILDING_NUM] AS [BUILDING_NUM], 
        [Extent4].[DSCR] AS [DSCR], 
        [Extent4].[UNITS] AS [UNITS], 
        [Extent4].[UNIT_PRICE] AS [UNIT_PRICE], 
        [Extent4].[YEAR_BUILT] AS [YEAR_BUILT1], 
        [Extent4].[CD] AS [CD], 
        [Extent4].[STRAP] AS [STRAP2], 
        CAST(NULL AS varchar(1)) AS [C10], 
        CAST(NULL AS int) AS [C11], 
        CAST(NULL AS int) AS [C12], 
        CAST(NULL AS varchar(1)) AS [C13], 
        CAST(NULL AS varchar(1)) AS [C14], 
        CAST(NULL AS varchar(1)) AS [C15], 
        CAST(NULL AS varchar(1)) AS [C16], 
        CAST(NULL AS int) AS [C17]
        FROM  [dbo].[Buildings] AS [Extent3]
        INNER JOIN [dbo].[EXTRA_FEATURES] AS [Extent4] ON ([Extent3].[STRAP] = [Extent4].[STRAP]) AND ([Extent3].[NUM] = [Extent4].[BUILDING_NUM])
        WHERE ([Extent3].[STRAP] = '0001020003') AND ([Extent3].[NUM] = 1)) AS [UnionAll1]
UNION ALL
    SELECT 
    3 AS [C1], 
    [Extent5].[NUM] AS [NUM], 
    [Extent5].[STRAP] AS [STRAP], 
    [Extent5].[NUM] AS [NUM1], 
    [Extent5].[SITUS] AS [SITUS], 
    [Extent5].[TYPE] AS [TYPE], 
    [Extent5].[STYLE] AS [STYLE], 
    [Extent5].[YEAR_BUILT] AS [YEAR_BUILT], 
    [Extent5].[GROSS_AREA] AS [GROSS_AREA], 
    [Extent5].[LIVING_AREA] AS [LIVING_AREA], 
    CAST(NULL AS varchar(1)) AS [C2], 
    CAST(NULL AS int) AS [C3], 
    CAST(NULL AS int) AS [C4], 
    CAST(NULL AS varchar(1)) AS [C5], 
    CAST(NULL AS int) AS [C6], 
    CAST(NULL AS int) AS [C7], 
    CAST(NULL AS varchar(1)) AS [C8], 
    CAST(NULL AS int) AS [C9], 
    CAST(NULL AS varchar(1)) AS [C10], 
    CAST(NULL AS int) AS [C11], 
    CAST(NULL AS int) AS [C12], 
    CAST(NULL AS varchar(1)) AS [C13], 
    CAST(NULL AS decimal(18,2)) AS [C14], 
    CAST(NULL AS decimal(18,2)) AS [C15], 
    CAST(NULL AS int) AS [C16], 
    CAST(NULL AS varchar(1)) AS [C17], 
    CAST(NULL AS varchar(1)) AS [C18], 
    [Extent6].[STRAP] AS [STRAP1], 
    [Extent6].[BUILDING_NUM] AS [BUILDING_NUM], 
    [Extent6].[LN_NUM] AS [LN_NUM], 
    [Extent6].[CATEGORY] AS [CATEGORY], 
    [Extent6].[DSCR] AS [DSCR], 
    [Extent6].[VALUE] AS [VALUE], 
    [Extent6].[STRAP] AS [STRAP2], 
    [Extent6].[BUILDING_NUM] AS [BUILDING_NUM1]
    FROM  [dbo].[Buildings] AS [Extent5]
    INNER JOIN [dbo].[STRUCTURAL_ELEMENTS] AS [Extent6] ON ([Extent5].[STRAP] = [Extent6].[STRAP]) AND ([Extent5].[NUM] = [Extent6].[BUILDING_NUM])
    WHERE ([Extent5].[STRAP] = '0001020003') AND ([Extent5].[NUM] = 1)) AS [UnionAll2]
ORDER BY [UnionAll2].[C3] ASC, [UnionAll2].[C4] ASC, [UnionAll2].[C1] ASC

模型类

[Table("STRUCTURAL_ELEMENTS")]
public class StructuralElement
{
    [Key]
    [Column(Order = 0)]
    public string STRAP { get; set; }
    [Key]
    [Column(Order = 1)]
    public int BUILDING_NUM { get; set; }
    [Key]
    [Column(Order = 2)]
    public int LN_NUM { get; set; }
    [Key]
    [Column(Order = 3)]
    public string CATEGORY { get; set; }
    public string DSCR { get; set; }
    public string VALUE { get; set; }

}

[Table("SUB_AREAS")]
public class SubArea
{
    [Key]
    [Column(Order = 0)]
    public string STRAP { get; set; }
    [Key]
    [Column(Order = 1)]
    public int BUILDING_NUM { get; set; }
    [Key]
    [Column(Order = 2)]
    public int SAR_LN_NUM { get; set; }

    public string DSCR { get; set; }
    public int GROSS_AREA { get; set; }
    public int VALUE { get; set; }
}

[Table("EXTRA_FEATURES")]
public class ExtraFeature
{
    [Key]
    [Column(Order = 0)]
    public string STRAP { get; set; }
    [Column(Order = 1)]
    public int BUILDING_NUM { get; set; }
    [Key]
    [Column(Order = 2)]
    public int LN_NUM { get; set; }

    public string DSCR { get; set; }
    public decimal? UNITS { get; set; }
    public decimal? UNIT_PRICE { get; set; }
    public int? YEAR_BUILT { get; set; }
    public string CD { get; set; }

}

public class Building
{
    [Key]
    [Column(Order = 0)]
    public string STRAP { get; set; }

    [Key]
    [Column(Order = 1)]
    public int NUM { get; set; }
    public string SITUS { get; set; }
    public string TYPE { get; set; }
    public string STYLE { get; set; }
    //public string CLASS { get; set; }
    public int? YEAR_BUILT { get; set; }
    public int? GROSS_AREA { get; set; }
    public int? LIVING_AREA { get; set; }

    [ForeignKey("STRAP,BUILDING_NUM")]
    public  ICollection<StructuralElement> StructuralElements { get; set; }

    [ForeignKey("STRAP,BUILDING_NUM")]
    public  ICollection<ExtraFeature> ExtraFeatures { get; set; }

    [ForeignKey("STRAP,BUILDING_NUM")]
    public  ICollection<SubArea> SubAreas { get; set; }


}

2 个答案:

答案 0 :(得分:0)

看起来像是一种优化。您正在尝试使用相关集合加载Building。现在想象一下,这座建筑有100个SubAreas,100个ExtraFeatures和100个StructuralElements,天真的JOIN会产生什么?正确,一百万行。 ORM并不像通常认为的那样愚蠢,用UNION查询将返回301行。

答案 1 :(得分:0)

空表中的我的密钥是用空格存储的,因此EF没有将它们链接到它们的父级。