EF генерирует неэффективный запросC#

Место общения программистов C#
Ответить
Anonymous
 EF генерирует неэффективный запрос

Сообщение Anonymous »


Мне нужно получить несколько значений:

ВЫБРАТЬ подробно.detailId, COUNT(*) как итог, COUNT (СЛУЧАЙ, когда t.Status = 1 и t.Type = 2, затем заканчивается 1) как TotalSub ... ОТ [GeneralDetails] КАК [подробно] присоединиться к среде t на t.Id = Detail.EnvironmentId где ([подробно].[EnvironmentId] НЕ НУЛЬ) группировать по Detail.detailId Итак, в коде я попробовал это, что кажется очень близким к исходному запросу:

Общие сведения .Где(подробно=> подробно.EnvironmentId!= ноль) .GroupBy(detail=> Detail.detailId) .Select(detailGroup=> новый { DetailGroup.detailId, Итого = DetailGroup.Count(), TotalSub = DetailGroup.Count(detail=>detail.Environment.Status == Статус.Включено && подробно.Среда.Тип == Тип.Общий) ... }); Однако вместо этого он генерирует этот запрос, который работает очень медленно:

ВЫБРАТЬ .[detailId], COUNT(*) AS [Всего], -- с отдельным подзапросом для каждого счетчика, подобного этому ( ВЫБЕРИТЕ СЧЕТ (*) ИЗ [GeneralDetails] AS [s0] ЛЕВОЕ СОЕДИНЕНИЕ [Среда] КАК [t] ON [s0].[EnvironmentId] = [t].[Id] ГДЕ ([s0].[EnvironmentId] НЕ NULL) И .[detailId] = [s0].[detailId] И [t].[Status] = 1 И [t].[Type] = 2) КАК [ActiveSub] ... ИЗ [GeneralDetails] КАК ГДЕ .[EnvironmentId] НЕ НУЛЬ ГРУППИРОВАТЬ ПО .[detailId] Что мне не хватает? Как заставить EF генерировать более быстрый запрос?

Обновить Изменение кода на

... TotalSub = DetailGroup.Sum(detail=> подробно.Среда.Состояние == Статус.Включено && подробно.Среда.Тип == Тип.Общий? 1: 0) ... Выдает одинаково медленный запрос:
SELECT .[detailId], COUNT(*) AS [Total], ( ВЫБРАТЬ COALESCE(SUM(CASE) КОГДА [t].[Состояние] = 1 И [t].[Тип] = 2 ТОГДА 1 ЕЩЕ 0 КОНЕЦ), 0) ИЗ [GeneralDetails] AS [s0] ЛЕВОЕ СОЕДИНЕНИЕ [Среда] КАК [t] ON [s0].[EnvironmentId] = [t].[Id] ГДЕ ([s0].[EnvironmentId] НЕ NULL) И .[detailId] = [s0].[detailId]) AS [TotalSub] ИЗ [GeneralDetails] КАК ГДЕ .[EnvironmentId] НЕ НУЛЬ ГРУППИРОВАТЬ ПО .[detailId]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»