开发者

How do I query just one level of a table-per-type mapping?

I'm using Entity Framework 4.1's code first approach to map a class hierarchy to a series of tables.

I have the following classes defined:

[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; }
}

So this will create three tables, where the common properties (Id and Name) are stored in a FooBase table.

In one particular case I am only interested in a list of names of any kind of FooBase object. I don't care whether it's a Foo1 or a Foo2. I spin up a new data context and run a query like this:

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

Now, I don't need the overhead of querying the Foo1s and Foo2s tables. I expect the query to just be a simple SELECT Name FROM FooBases. Instead, I get this:

开发者_运维技巧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]

Is there a way to tell Entity Framework that I don't care about the other tables; that I just want data from the top level of the class hierarchy so there's no need to query anything other than the top level table?


This is well known issue with Table-per-type inheritance mapping. It should be addressed in upcoming EFv4.2 which should improve the query generation for TPT inheritance. At the moment there is no way to improve it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜