Как запросить только один уровень сопоставления таблицы на тип? - PullRequest
2 голосов
/ 11 августа 2011

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

1 Ответ

3 голосов
/ 11 августа 2011

Это общеизвестная проблема с отображением наследования таблицы на тип.Он должен быть адресован в EFv4.2 , который должен улучшить генерацию запросов для наследования TPT .На данный момент нет способа улучшить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...