public async Task <ListResultDto <CandidateInfoDto> > GetCandidates(CandidateFilterDto input) { var jobSeekerQuery = _jobSeekerRepo.GetAll(); var orientationQuery = _orientationRepo.GetAll(); var reviewQuery = _reviewRepo.GetAll(); var skillQuery = _skillRepo.GetAll(); var query = from j in jobSeekerQuery join o in orientationQuery on j.Id equals o.IDJobSeeker into orientation from o in orientation.DefaultIfEmpty() join r in reviewQuery on j.Id equals r.IDJobSeeker into review from r in review.DefaultIfEmpty() join s in skillQuery on j.Id equals s.IDJobSeeker into skill from s in skill.DefaultIfEmpty() select new { jobSeeker = j, orientation = o, review = r, skill = s }; var list = await query.Distinct().ToListAsync(); var filteredList = list .WhereIf(!input.Expertise.IsNullOrWhiteSpace(), q => q.jobSeeker.Expertise.ToLower() == input.Expertise.ToLower()) .WhereIf(input.MinAge.HasValue, q => q.jobSeeker.Birthday.HasValue) .WhereIf(input.MinAge.HasValue, q => DateTime.Now.Year - q.jobSeeker.Birthday.Value.Year >= input.MinAge.Value) .WhereIf(input.MaxAge.HasValue, q => q.jobSeeker.Birthday.HasValue) .WhereIf(input.MaxAge.HasValue, q => DateTime.Now.Year - q.jobSeeker.Birthday.Value.Year <= input.MaxAge.Value) .WhereIf(!input.Operation.IsNullOrWhiteSpace(), q => q.orientation.OrientationName.ToLower() == input.Operation.ToLower()) .WhereIf(!input.Province.IsNullOrWhiteSpace(), q => q.jobSeeker.Address.ToLower().Contains(input.Province.ToLower())) .WhereIf(input.Rating.HasValue, q => q.review.RatingStar >= input.Rating) .WhereIf(!input.Skills.IsNullOrEmpty(), q => input.Skills.Select(x => x.ToLower()).Contains(q.skill.SkillName.ToLower())) .GroupBy(q => q.jobSeeker.Id) .Select(q => q.First()); var candidatesList = filteredList.Select(q => new CandidateInfoDto() { Id = q.jobSeeker.Id, Name = q.jobSeeker.Name, Address = q.jobSeeker.Address, Age = DateTime.Now.Year - q.jobSeeker.Birthday.Value.Year, Expertise = q.jobSeeker.Expertise, Operation = q.orientation.OrientationName, Rating = q.review.RatingStar.Value, Skills = skillQuery.Where(s => s.IDJobSeeker == q.jobSeeker.Id).Select(s => s.SkillName).ToList(), }) .OrderByDescending(q => q.Rating); return(new ListResultDto <CandidateInfoDto>(candidatesList.ToList())); }
public async Task <ListResultDto <CandidateInfoDto> > Get(CandidateFilterDto filter) { return(await _searchCandidateAppService.GetCandidates(filter)); }