我正在使用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())
的问题,但是我在这里找不到合适的替代方法。