public MovieIndexDto GetAllForIndex(int yearMin, int yearMax, int gradeMin, int gradeMax, int[] categories, string sortOrder, int?pageNumber, int pageSize = 5) { MovieIndexDto moviesForIndex = new MovieIndexDto() { Movies = _movieRepository.GetAll().ProjectTo <MovieDto>(_mapper.ConfigurationProvider).AsEnumerable(), Categories = _categoryRepository.GetAll().ProjectTo <CategoryDto>(_mapper.ConfigurationProvider).ToList(),//.AsEnumerable(), GradeMin = gradeMin, GradeMax = gradeMax == 0 ? 10 : gradeMax, YearMax = yearMax == 0 ? 2100 : yearMax, YearMin = yearMin == 0 ? yearMax : yearMin, CategoriesIds = categories, SortOrder = sortOrder, PageNumber = pageNumber, PageSize = pageSize }; Filter(moviesForIndex); Sort(moviesForIndex); moviesForIndex.PaginatedMovies = PaginatedList <MovieDto> .Create(moviesForIndex.Movies.AsQueryable(), pageNumber ?? 1, pageSize); return(moviesForIndex); }
private void Sort(MovieIndexDto moviesForIndex) { switch (moviesForIndex.SortOrder) { case "nameDesc": moviesForIndex.Movies = moviesForIndex.Movies.OrderByDescending(m => m.Name); break; case "yearDesc": moviesForIndex.Movies = moviesForIndex.Movies.OrderByDescending(m => m.ReleaseDate); break; case "year": moviesForIndex.Movies = moviesForIndex.Movies.OrderBy(m => m.ReleaseDate); break; case "gradeDesc": moviesForIndex.Movies = moviesForIndex.Movies.Where(m => m.Reviews.Any()).OrderByDescending(m => m.Reviews.Average(k => k.Grade)).Union(moviesForIndex.Movies); break; case "grade": moviesForIndex.Movies = moviesForIndex.Movies.Where(m => m.Reviews.Any()).OrderBy(m => m.Reviews.Average(k => k.Grade)).Union(moviesForIndex.Movies); break; case "quantityGradeDesc": moviesForIndex.Movies = moviesForIndex.Movies.Where(m => m.Reviews.Any()).OrderByDescending(m => m.Reviews.Count()).Union(moviesForIndex.Movies); break; case "quantityGrade": moviesForIndex.Movies = moviesForIndex.Movies.Where(m => m.Reviews.Any()).OrderBy(m => m.Reviews.Count()).Union(moviesForIndex.Movies); break; default: moviesForIndex.Movies = moviesForIndex.Movies.OrderBy(m => m.Name); break; } }
//------------------------------------------------------------------------------- private void Filter(MovieIndexDto moviesForIndex) { if (moviesForIndex.CategoriesIds.Length != 0) { foreach (var category in moviesForIndex.CategoriesIds) { var moviesWithCategory = _movieCategoryRepository.GetMoviesByCategory(category).ProjectTo <MovieDto>(_mapper.ConfigurationProvider).AsEnumerable(); moviesForIndex.Movies = moviesForIndex.Movies.Intersect(moviesWithCategory, new MovieDtoComparer()); } } var filter = moviesForIndex.Movies.Where(m => m.ReleaseDate.Year >= moviesForIndex.YearMin && m.ReleaseDate.Year <= moviesForIndex.YearMax); moviesForIndex.Movies = filter.Where(m => m.Reviews.Any()) .Where(m => m.Reviews .Average(m => m.Grade) >= moviesForIndex.GradeMin && m.Reviews .Average(m => m.Grade) < moviesForIndex.GradeMax + 1); if (moviesForIndex.GradeMin == 0) { moviesForIndex.Movies = moviesForIndex.Movies.Union(filter.Where(m => m.Reviews.Any() == false)); } }