我正在使用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);
现在,我不需要查询Foo1s
和Foo2s
表的开销。我希望查询只是一个简单的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我不关心其他表;我只想要来自类层次结构顶层的数据,这样就不需要查询除顶级表之外的任何内容了吗?
答案 0 :(得分:3)
这是well known issue,具有每个类型的表继承映射。应该在upcoming EFv4.2 improve the query generation for TPT inheritance处理{{3}}。目前没有办法改善它。