Оптимизация запросов в Entity Framework Core / LINQ для группировки по / count () - PullRequest
1 голос
/ 07 мая 2020

Я пробовал разные способы написания запросов, включающих «группировать по» и «count ()», используя Entity Framework Core и LINQ. Но созданный SQL просто возвращает все записи, а затем в памяти выполняется «group by» и «count ()».

В настоящее время я пытаюсь написать запрос, эквивалентный следующему SQL:

select 
    e.EngagementId,
    e.Name,
    c.ClientName,
    count(distinct ed.EngagementDocumentId) as DocumentCount,
    count(distinct es.EngagementSurveyId) as SurveyCount
from Engagement e
inner join Client c on c.ClientId = e.ClientId
left outer join EngagementDocument ed on ed.EngagementId = e.EngagementId
left outer join EngagementSurvey es on es.EngagementId = e.EngagementId
group by e.EngagementId, e.Name, c.ClientName

Мой вопрос: как я могу написать запрос, который генерирует похожие SQL?

1 Ответ

0 голосов
/ 07 мая 2020

Я бы порекомендовал коррелированные подзапросы или (что эквивалентно) боковые соединения:

select e.EngagementId, e.Name, c.ClientName,
       (select count(*)
        from EngagementDocument ed 
        where ed.EngagementId = e.EngagementId,
       ) as DocumentCount,
       (select count(*)
        from EngagementSurvey es 
        where es.EngagementId = e.EngagementId,
       ) as SurveyCount
from Engagement e inner join
     Client c 
     on c.ClientId = e.ClientId;

Кроме того, ваши индексы запросов на EngagementDocument(EngagementId) и EngagementSurvey(EngagementId). Декартово произведение документов и опросов для каждого клиента / взаимодействия, а затем использование дополнительных ресурсов для агрегирования и удаления дубликатов. Вышеупомянутые могут просто подсчитывать, просматривая индексы.

...