При запросе базового типа, почему поставщик EF генерирует все эти предложения UNION All - PullRequest
0 голосов
/ 08 ноября 2010

Если у меня есть модель, которая выглядит следующим образом: alt text

и я делаю запрос Linq to Entities следующим образом:

var c = MyContext.Contact.Count();

Я получу SQL-запрос размером с дверь!

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM   [dbo].[Contacts] AS [Extent1]
    LEFT OUTER JOIN  (SELECT 
        [UnionAll1].[Id] AS [C1]
        FROM  (SELECT 
            [Extent2].[Id] AS [Id]
            FROM [dbo].[Companies] AS [Extent2]
        UNION ALL
            SELECT 
            [Extent3].[Id] AS [Id]
            FROM [dbo].[Employees] AS [Extent3]) AS [UnionAll1]
    UNION ALL
        SELECT 
        [Extent4].[Id] AS [Id]
        FROM [dbo].[Contractors] AS [Extent4]) AS [UnionAll2] ON [Extent1].[Id] = [UnionAll2].[C1]
    LEFT OUTER JOIN  (SELECT 
        [UnionAll3].[Id] AS [C1]
        FROM  (SELECT 
            [Extent5].[Id] AS [Id]
            FROM [dbo].[Suppliers] AS [Extent5]
        UNION ALL
            SELECT 
            [Extent6].[Id] AS [Id]
            FROM [dbo].[Customers] AS [Extent6]) AS [UnionAll3]
    UNION ALL
        SELECT 
        [Extent7].[Id] AS [Id]
        FROM [dbo].[People] AS [Extent7]) AS [UnionAll4] ON [Extent1].[Id] = [UnionAll4].[C1]
)  AS [GroupBy1]

Мне кажется, что это должен быть очень простой запрос, выполняемый над таблицей базовых типов (в данном случае контакт). Модель, которую я здесь включил, представляет собой разбавленный образец того, с чем я работаю. Как вы можете себе представить, с иерархией 6 уровней, а не 3, SQL-запросы на что-либо, кроме самых производных типов, очень дороги.

Есть ли способ изменить запрос или определение модели, чтобы уменьшить ненужную сложность этого запроса.

1 Ответ

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