コード例 #1
0
        public async Task <IActionResult> List(FilterMinuteServiceDto filterMinuteServiceDto)
        {
            if (!ModelState.IsValid)
            {
                return(View());
            }
            var minuteServices = await _minuteServiceService.FilterMinuteServicesAsync(filterMinuteServiceDto);

            ViewBag.MinuteServices = minuteServices;

            return(View());
        }
コード例 #2
0
        public async Task <List <GetMinuteServiceDto> > FilterMinuteServicesAsync(FilterMinuteServiceDto filterMinuteServiceDto)
        {
            var filteredMinuteServices = await _repository.FilterAsync(filterMinuteServiceDto);

            return(filteredMinuteServices.Select(ms => _converter.MinuteServiceToGetMinuteServiceDto(ms)).ToList());
        }
コード例 #3
0
        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);
        }