Как я могу оптимизировать этот запрос Linq, чтобы удалить ненужный счетчик SELECT (*) - PullRequest
3 голосов
/ 04 мая 2011

У меня есть три таблицы: сущность, период и результат. Между сущностью и периодом существует соотношение 1: 1, а между периодом и результатом - 1: много.

Это запрос linq:

int id = 100;
DateTime start = DateTime.Now;

from p in db.Periods
where p.Entity.ObjectId == id && p.Start == start
select new { Period = p, Results = p.Results })

Это соответствующие части сгенерированного SQL:

SELECT [t0].[EntityId], [t2].[PeriodId], [t2].[Value], (
    SELECT COUNT(*)
    FROM [dbo].[Result] AS [t3]
    WHERE [t3].[PeriodId] = [t0].[Id]
    ) AS [value2]

FROM [dbo].[Period] AS [t0]
INNER JOIN [dbo].[Entity] AS [t1] ON [t1].[Id] = [t0].[EntityId]
LEFT OUTER JOIN [dbo].[Result] AS [t2] ON [t2].[PeriodId] = [t0].[Id]
WHERE ([t1].[ObjectId] = 100) AND ([t0].[Start] = '2010-02-01 00:00:00')

Откуда берется счетчик SELECT (*) и как от него избавиться? Мне не нужен счетчик «Результатов» для каждого «Периода», и это замедляет запрос на порядок.

1 Ответ

1 голос
/ 26 июля 2011

Попробуйте использовать Context.LoadOptions и указать для параметра Period to LoadWith (p => p.Results) загрузку периода с результатами без необходимости проецирования в анонимный тип.

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