//---------------------------------------------------------------------------------------

        private void Filter(ActorIndexDto actorsForIndex)
        {
            if (actorsForIndex.Countries.Length != 0)
            {
                foreach (var country in actorsForIndex.Countries)
                {
                    actorsForIndex.Actors = actorsForIndex.Actors.Intersect(actorsForIndex.Actors.Where(a => a.Country == country), new ActorDtoComparer());
                }
            }

            IEnumerable <ActorDto> filter;

            if (actorsForIndex.Gender != null)
            {
                filter = actorsForIndex.Actors.Where(m => m.Gender == actorsForIndex.Gender)
                         .Where(m => m.BornDate.Year >= actorsForIndex.YearMin && m.BornDate.Year <= actorsForIndex.YearMax);
                //actorsForIndex.Actors = filter.Where(m => m.Grades.Any())
                //                                .Where(m => m.Grades
                //                                    .Average(m => m.GradeValue) >= actorsForIndex.GradeMin && m.Grades
                //                                        .Average(m => m.GradeValue) < actorsForIndex.GradeMax + 1);
                // .Union(filter.Where(a => a.Grades.Any() == false));
            }
            else
            {
                filter = actorsForIndex.Actors.Where(m => m.BornDate.Year >= actorsForIndex.YearMin && m.BornDate.Year <= actorsForIndex.YearMax);

                //actorsForIndex.Actors = filter.Where(m => m.Grades.Any())
                //                                 .Where(m => m.Grades
                //                                    .Average(m => m.GradeValue) >= actorsForIndex.GradeMin && m.Grades
                //                                        .Average(m => m.GradeValue) < actorsForIndex.GradeMax + 1);
                //  .Union(filter.Where(a => a.Grades.Any() == false));
            }

            actorsForIndex.Actors = filter.Where(m => m.Grades.Any())
                                    .Where(m => m.Grades
                                           .Average(m => m.GradeValue) >= actorsForIndex.GradeMin && m.Grades
                                           .Average(m => m.GradeValue) < actorsForIndex.GradeMax + 1);

            if (actorsForIndex.GradeMin == 0)
            {
                actorsForIndex.Actors = actorsForIndex.Actors.Union(filter.Where(a => a.Grades.Any() == false));
            }

            //actorsForIndex.Actors = actorsForIndex.Gender != null ? actorsForIndex.Actors.Where(m => m.Gender == actorsForIndex.Gender)
            //                                                                             .Where(m => m.BornDate.Year >= actorsForIndex.YearMin && m.BornDate.Year <= actorsForIndex.YearMax)//;
            //                                                                             .Where(m => m.Grades.Any())
            //                                                                                .Where(m => m.Grades
            //                                                                                    .Average(m => m.GradeValue) >= actorsForIndex.GradeMin && m.Grades
            //                                                                                        .Average(m => m.GradeValue) < actorsForIndex.GradeMax + 1)
            //                                                      : actorsForIndex.Actors.Where(m => m.BornDate.Year >= actorsForIndex.YearMin && m.BornDate.Year <= actorsForIndex.YearMax)//;
            //                                                                             .Where(m => m.Grades.Any())
            //                                                                                .Where(m => m.Grades
            //                                                                                    .Average(m => m.GradeValue) >= actorsForIndex.GradeMin && m.Grades
            //                                                                                        .Average(m => m.GradeValue) < actorsForIndex.GradeMax + 1);
            //return actorsForIndex;
        }
        public ActorIndexDto GetAllForIndex(GenderDto?gender, int yearMin, int yearMax, int gradeMin, int gradeMax, string[] countries, string sortOrder, int?pageNumber, int pageSize = 5)
        {
            ActorIndexDto actorsForIndex = new ActorIndexDto()
            {
                Actors     = _actorRepository.GetAll().ProjectTo <ActorDto>(_mapper.ConfigurationProvider).AsEnumerable(),
                GradeMin   = gradeMin,
                GradeMax   = gradeMax == 0 ? 10 : gradeMax,
                YearMax    = yearMax == 0 ? 2100 : yearMax,
                YearMin    = yearMin == 0 ? yearMax : yearMin,
                Gender     = gender,
                Countries  = countries,
                SortOrder  = sortOrder,
                PageNumber = pageNumber,
                PageSize   = pageSize
            };

            Filter(actorsForIndex);
            Sort(actorsForIndex);

            actorsForIndex.PaginatedActors = PaginatedList <ActorDto> .Create(actorsForIndex.Actors.AsQueryable(), pageNumber ?? 1, pageSize);

            return(actorsForIndex);
        }
        private void Sort(ActorIndexDto actorsForIndex)
        {
            switch (actorsForIndex.SortOrder)
            {
            case "nameDesc":
                actorsForIndex.Actors = actorsForIndex.Actors.OrderByDescending(m => m.LastName);
                break;

            case "bornDesc":
                actorsForIndex.Actors = actorsForIndex.Actors.OrderByDescending(m => m.BornDate);
                break;

            case "born":
                actorsForIndex.Actors = actorsForIndex.Actors.OrderBy(m => m.BornDate);
                break;

            case "gradeDesc":
                actorsForIndex.Actors = actorsForIndex.Actors.Where(m => m.Grades.Any()).OrderByDescending(m => m.Grades.Average(k => k.GradeValue)).Union(actorsForIndex.Actors);
                break;

            case "grade":
                actorsForIndex.Actors = actorsForIndex.Actors.Where(m => m.Grades.Any()).OrderBy(m => m.Grades.Average(k => k.GradeValue)).Union(actorsForIndex.Actors);
                break;

            case "quantityGradeDesc":
                actorsForIndex.Actors = actorsForIndex.Actors.Where(m => m.Grades.Any()).OrderByDescending(m => m.Grades.Count()).Union(actorsForIndex.Actors);
                break;

            case "quantityGrade":
                actorsForIndex.Actors = actorsForIndex.Actors.Where(m => m.Grades.Any()).OrderBy(m => m.Grades.Count()).Union(actorsForIndex.Actors);
                break;

            default:
                actorsForIndex.Actors = actorsForIndex.Actors.OrderBy(m => m.LastName);
                break;
            }
        }