EF генерирует неэффективный запрос ⇐ C#
-
Anonymous
EF генерирует неэффективный запрос
Мне нужно получить несколько значений:
ВЫБРАТЬ подробно.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]
Мне нужно получить несколько значений:
ВЫБРАТЬ подробно.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]
Мобильная версия