Я использую ядро EF для выполнения сложного запроса. Мне нужно использовать group by
и выбрать лучший результат из группы, а затем выполнить фильтр в верхних строках каждой группы.
Когда я использую профилировщик EF, он показывает, что запрос извлек 21647 строк, а конечный результат после фильтра равен 28. Я предполагаю, что EF использует запрос where после извлечения столбцов из БД.
Вот структура запроса.
private IQueryable<long> GetAssignedIds(int? lpId = null, int? customerTenantId = null)
{
var islpAdmin = _permissionChecker.IsGranted(AppPermissions.Pages_PP_lpAdmin);
var query = (
from -------QUERY--------------------
join -------QUERY--------------------
join -------QUERY--------------------
join -------QUERY--------------------
select new
{
-----SELECT VARIABLES----------
})
.OrderBy(c => c.Priority)
.GroupBy(c => new { c.ScpId, c.OrderId })
.Select(c => c.FirstOrDefault())
.WhereIf(lpId.HasValue, c => c.lpId == lpId)
.WhereIf(islpAdmin, c => c.lpId == currentTenantId)
.WhereIf(!islpAdmin, c => c.eId == currentTenantId)
.Select(c => c.ScoId)
.Distinct();
}
Как я могу оптимизировать этот запрос? Я знаю, что .Select(c => c.FirstOrDefault())
проблема здесь, но я не могу найти правильную альтернативу здесь.