如何查询每个类型的映射的一个级别?

时间:2011-08-11 05:52:30

标签: entity-framework entity-framework-4.1 ef-code-first table-per-type

我正在使用Entity Framework 4.1的代码第一种方法将类层次结构映射到一系列表。

我定义了以下类:

[Table("FooBases")]
public class FooBase
{
    public int Id { get; set; }
    public string Name { get; set; }
}

[Table("Foo1s")]
public class Foo1 : FooBase
{
    public string Details { get; set; }
}

[Table("Foo2s")]
public class Foo2 : FooBase
{
    public string Description { get; set; }
}

因此,这将创建三个表,其中公共属性(Id和Name)存储在FooBase表中。

在一个特定情况下,我只对任何类型FooBase对象的名称列表感兴趣。我不在乎它是Foo1还是Foo2。我启动了一个新的数据上下文并运行如下查询:

var names = ctx.Set<FooBase>().Select(f => f.Name);

现在,我不需要查询Foo1sFoo2s表的开销。我希望查询只是一个简单的SELECT Name FROM FooBases。相反,我得到了这个:

SELECT 
[Extent1].[Name] AS [Name]
FROM  [dbo].[FooBases] AS [Extent1]
LEFT OUTER JOIN  (SELECT 
    [Extent2].[Id] AS [Id]
    FROM [dbo].[Foo1s] AS [Extent2]
UNION ALL
    SELECT 
    [Extent3].[Id] AS [Id]
    FROM [dbo].[Foo2s] AS [Extent3]) AS [UnionAll1] ON [Extent1].[Id] = [UnionAll1].[Id]

有没有办法告诉Entity Framework我不关心其他表;我只想要来自类层次结构顶层的数据,这样就不需要查询除顶级表之外的任何内容了吗?

1 个答案:

答案 0 :(得分:3)

这是well known issue,具有每个类型的表继承映射。应该在upcoming EFv4.2 improve the query generation for TPT inheritance处理{{3}}。目前没有办法改善它。