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.