Я использую кодовый подход 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, что мне нет дела до других таблиц; что мне просто нужны данные из верхнего уровня иерархии классов, чтобы не нужно было запрашивать что-либо, кроме таблицы верхнего уровня?