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));
            }
        }