public async Task <IActionResult> List(FilterMinuteServiceDto filterMinuteServiceDto) { if (!ModelState.IsValid) { return(View()); } var minuteServices = await _minuteServiceService.FilterMinuteServicesAsync(filterMinuteServiceDto); ViewBag.MinuteServices = minuteServices; return(View()); }
public async Task <List <GetMinuteServiceDto> > FilterMinuteServicesAsync(FilterMinuteServiceDto filterMinuteServiceDto) { var filteredMinuteServices = await _repository.FilterAsync(filterMinuteServiceDto); return(filteredMinuteServices.Select(ms => _converter.MinuteServiceToGetMinuteServiceDto(ms)).ToList()); }
public async Task <IEnumerable <MinuteService> > FilterAsync(FilterMinuteServiceDto filterMinuteServiceDto) { int filters = 0; bool availableFiltered = false; List <MinuteService> result = new List <MinuteService>(); int minId = filterMinuteServiceDto.MinId ?? 0; int maxId = filterMinuteServiceDto.MaxId ?? 0; if (minId > 0 || maxId > 0) { var filteredMinIds = await _db.MinuteServices.Where(ms => ms.Id >= minId).ToListAsync(); var filteredMaxIds = await _db.MinuteServices.Where(ms => ms.Id <= maxId).ToListAsync(); if (minId > 0 && maxId == 0) { result.AddRange(filteredMinIds); } else if (maxId > 0 && minId == 0) { result.AddRange(filteredMaxIds); } result.AddRange(filteredMaxIds.Intersect(filteredMinIds)); filters += 1; } if (!string.IsNullOrEmpty(filterMinuteServiceDto.Name)) { var filteredNames = await _db.MinuteServices.Where(ms => EF.Functions.Like(ms.Name, $"%{filterMinuteServiceDto.Name}%")).ToListAsync(); result.AddRange(filteredNames); filters += 1; } if (!string.IsNullOrEmpty(filterMinuteServiceDto.Description)) { var filteredDescriptions = await _db.MinuteServices.Where(ms => EF.Functions.Like(ms.Name, $"%{filterMinuteServiceDto.Description}%")).ToListAsync(); result.AddRange(filteredDescriptions); filters += 1; } decimal minPricePerMinute = filterMinuteServiceDto.MinPricePerMinute ?? 0; decimal maxPricePerMinute = filterMinuteServiceDto.MaxPricePerMinute ?? 0; if (minPricePerMinute > 0 || maxPricePerMinute > 0) { var filteredMinPricesPerMinute = await _db.MinuteServices.Where(ms => ms.PricePerMinute >= minPricePerMinute).ToListAsync(); var filteredMaxPricesPerMinute = await _db.MinuteServices.Where(ms => ms.PricePerMinute <= maxPricePerMinute).ToListAsync(); if (minPricePerMinute > 0 && maxPricePerMinute == 0) { result.AddRange(filteredMinPricesPerMinute); } else if (minPricePerMinute > 0 && maxPricePerMinute == 0) { result.AddRange(filteredMaxPricesPerMinute); } result.AddRange(filteredMaxPricesPerMinute.Intersect(filteredMinPricesPerMinute)); filters += 1; } int minTime = filterMinuteServiceDto.MinTime ?? 0; if (minTime != 0) { var filteredMinTimes = await _db.MinuteServices.Where(ms => ms.MinTime <= filterMinuteServiceDto.MinTime).ToListAsync(); result.AddRange(filteredMinTimes); filters += 1; } int maxTime = filterMinuteServiceDto.MaxTime ?? 0; if (maxTime != 0) { var filteredMaxTimes = await _db.MinuteServices.Where(ms => ms.MaxTime >= filterMinuteServiceDto.MaxTime).ToListAsync(); result.AddRange(filteredMaxTimes); filters += 1; } if (filterMinuteServiceDto.IsAvailable) { var availableMinuteServices = await _db.MinuteServices.Where(ms => ms.IsAvailable).ToListAsync(); result.AddRange(availableMinuteServices); if (!availableFiltered) { availableFiltered = true; } } if (filterMinuteServiceDto.IsNotAvailable) { var filteredNotAvailableMinuteServices = await _db.MinuteServices.Where(ms => !ms.IsAvailable).ToListAsync(); result.AddRange(filteredNotAvailableMinuteServices); if (!availableFiltered) { availableFiltered = true; } } if (availableFiltered) { filters += 1; } var groupedResults = result.GroupBy(r => r); List <MinuteService> finalResult = new List <MinuteService>(); foreach (var gr in groupedResults) { if (gr.Count() == filters) { finalResult.Add(gr.Key); } } return(finalResult); }