public async Task <Result <IEnumerable <DeveloperRankingListDto> > > ListWorkProjectsAsync([FromQuery] DeveloperRankingSearchDto searchDto) { return(GetResult(await _developerService.ListDeveloperRankingAsync(searchDto))); }
public async Task <Result <IEnumerable <DeveloperRankingListDto> > > ListDeveloperRankingAsync(DeveloperRankingSearchDto searchDto) { var rawDeveloperList = await _developerRepository.Query() .Select(d => new { Developer = new { d.Id, d.Name }, Works = d.DeveloperProjects .SelectMany(dp => dp.Works) .Where(w => w.StartTime >= searchDto.StartTime) .Where(w => searchDto.ProjectId == null || w.DeveloperProject.ProjectId == searchDto.ProjectId) }) .ToArrayAsync(); var rankingList = rawDeveloperList .Select(d => new DeveloperRankingListDto { Id = d.Developer.Id, Name = d.Developer.Name, SumHours = d.Works.Sum(w => w.Hours), AvgHours = d.Works.Any() ? d.Works.Average(w => w.Hours) : 0 }) .OrderByDescending(d => d.AvgHours) .Take(5); return(new Result <IEnumerable <DeveloperRankingListDto> >(rankingList, rankingList.Count())); }