public async Task <IActionResult> List(FilterServiceDto filterServiceDto) { if (!ModelState.IsValid) { return(View()); } var services = await _serviceService.FilterServicesAsync(filterServiceDto); ViewBag.Services = services; return(View()); }
public async Task <IEnumerable <Service> > FilterAsync(FilterServiceDto filterServiceDto) { int filters = 0; bool availableFiltered = false; List <Service> result = new List <Service>(); int minId = filterServiceDto.MinId ?? 0; int maxId = filterServiceDto.MaxId ?? 0; if (minId > 0 || maxId > 0) { var filteredMinIds = await _db.Services.Where(s => s.Id >= minId).ToListAsync(); var filteredMaxIds = await _db.Services.Where(s => s.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(filterServiceDto.Name)) { var filteredNames = await _db.Services.Where(s => EF.Functions.Like(s.Name, $"%{filterServiceDto.Name}%")).ToListAsync(); result.AddRange(filteredNames); filters += 1; } if (!string.IsNullOrEmpty(filterServiceDto.Description)) { var filteredDescriptions = await _db.Services.Where(s => EF.Functions.Like(s.Description, $"%{filterServiceDto.Description}%")).ToListAsync(); result.AddRange(filteredDescriptions); filters += 1; } if (filterServiceDto.IsAvailable) { var filteredAvailableServices = await _db.Services.Where(s => s.IsAvailable).ToListAsync(); result.AddRange(filteredAvailableServices); if (!availableFiltered) { availableFiltered = true; } } if (filterServiceDto.IsNotAvailable) { var filteredNotAvailableServices = await _db.Services.Where(s => !s.IsAvailable).ToListAsync(); result.AddRange(filteredNotAvailableServices); if (!availableFiltered) { availableFiltered = true; } } if (availableFiltered) { filters += 1; } var groupedResults = result.GroupBy(r => r); List <Service> finalResult = new List <Service>(); foreach (var gr in groupedResults) { if (gr.Count() == filters) { finalResult.Add(gr.Key); } } return(finalResult); }
public async Task <List <GetServiceDto> > FilterServicesAsync(FilterServiceDto filterServiceDto) { var filteredServices = await _repository.FilterAsync(filterServiceDto); return(filteredServices.Select(s => _converter.ServiceToGetServiceDto(s)).ToList()); }