public ActionResult AnnouncementsSelect()
        {
            var announcementSelect = new GeneralSelect {
                IsBlocked = false
            };

            if (User.IsInRole("Admin"))
            {
                announcementSelect.IsBlocked = null;
            }
            if (User.IsInRole("Admin") || User.IsInRole("HR"))
            {
                announcementSelect.CanSelectCandidates = true;
                announcementSelect.CanSelectVacancyes  = true;
                announcementSelect.IncludeCandidates   = true;
                announcementSelect.IncludeVacancyes    = true;
                announcementSelect.SelectCandidates    = new SelectCandidates();
                announcementSelect.SelectVacancyes     = new SelectVacancyes();
            }
            if (User.IsInRole("Employee"))
            {
                announcementSelect.CanSelectCandidates = true;
                announcementSelect.IncludeCandidates   = true;
                announcementSelect.SelectCandidates    = new SelectCandidates();
            }
            if (User.IsInRole("Jobseeker"))
            {
                announcementSelect.CanSelectVacancyes = true;
                announcementSelect.IncludeVacancyes   = true;
                announcementSelect.SelectVacancyes    = new SelectVacancyes();
            }
            var timesJob = Enum.GetValues(typeof(TimeJob)).Cast <TimeJob>();

            ViewBag.Employments = timesJob.Select(x => new SelectListItem {
                Value = x.ToString(), Text = General.Employments[x]
            }).ToList();
            return(View(announcementSelect));
        }
        public ActionResult AnnouncementsSelect(GeneralSelect generalSelect)
        {
            var timesJob = Enum.GetValues(typeof(TimeJob)).Cast <TimeJob>();

            ViewBag.Employments = timesJob.Select(x => new SelectListItem {
                Value = x.ToString(), Text = General.Employments[x]
            }).ToList();

            if (!ModelState.IsValid)
            {
                var modelStateValues = ModelState.Values.ToArray();
                var modelStateKeys   = ModelState.Keys.ToArray();
                if (modelStateValues.Any(x => x.Errors.Count > 0 && !General.NulableBoolPropertyes.Contains(modelStateKeys[Array.IndexOf(modelStateValues, x)])))
                {
                    ModelState.Clear();
                    MessageForClient(ActionStatus.Error, $"Отсутствует модель представления данных для выборки объявлений.");
                    return(PartialView("~/Views/Announcement/ListAnnouncement.cshtml", new List <MyAnnouncement>()));
                }
            }
            if (!User.IsInRole("Admin"))
            {
                generalSelect.IsBlocked = false;
            }
            var generalParams = generalSelect.GetType()?.GetProperties()?.ToDictionary(p => p.Name, p => p.GetValue(generalSelect));

            if (generalParams.Keys.Any(x => x == "IncludeVacancyes" && !(bool)generalParams[x]) && generalParams.Keys.Any(x => x == "IncludeCandidates" && !(bool)generalParams[x]))
            {
                ModelState.Clear();
                MessageForClient(ActionStatus.Warning, $"Вы не выбрали ни один тип объявлений для выборки.");
                return(PartialView("~/Views/Announcement/ListAnnouncement.cshtml", new List <MyAnnouncement>()));
            }
            var resultAnnouncements = new List <MyAnnouncement>();

            if (generalParams.Keys.Any(x => x == "IncludeVacancyes" && (bool)generalParams[x]))
            {
                var vacancyesParams = generalParams["SelectVacancyes"].GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(generalParams["SelectVacancyes"]));
                foreach (var param in generalParams.Where(x => !General.NotFilteredProperties.Contains(x.Key)))
                {
                    vacancyesParams.Add(param.Key, param.Value);
                }
                var vacancyesSelectResult = _announcementRepository.SelectAnnouncements(vacancyesParams);
                if (vacancyesSelectResult.Status == ActionStatus.Success)
                {
                    var vacancyAnnouncements = vacancyesSelectResult.Entity.Select(x => _mapper.Map <IAnnouncement, MyVacancy>(x as IAnnouncement));
                    resultAnnouncements.AddRange(vacancyAnnouncements);
                }
            }
            if (generalParams.Keys.Any(x => x == "IncludeCandidates" && (bool)generalParams[x]))
            {
                var candidatesParams = generalParams["SelectCandidates"].GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(generalParams["SelectCandidates"]));
                candidatesParams["BirthDayMin"] = DateTime.Now.AddYears(-(int)candidatesParams["AgeMax"]);
                candidatesParams["BirthDayMax"] = DateTime.Now.AddYears(-(int)candidatesParams["AgeMin"]);
                candidatesParams.Remove("AgeMin");
                candidatesParams.Remove("AgeMax");
                foreach (var param in generalParams.Where(x => !General.NotFilteredProperties.Contains(x.Key)))
                {
                    candidatesParams.Add(param.Key, param.Value);
                }

                var candidatesSelectResult = _announcementRepository.SelectAnnouncements(candidatesParams);
                if (candidatesSelectResult.Status == ActionStatus.Success)
                {
                    var vacancyAnnouncements = candidatesSelectResult.Entity.Select(x => _mapper.Map <IAnnouncement, MyCandidate>(x as IAnnouncement));
                    resultAnnouncements.AddRange(vacancyAnnouncements);
                }
            }
            ModelState.Clear();
            if (resultAnnouncements.Count() == 0)
            {
                MessageForClient(ActionStatus.Warning, $"Не найдены объявления, удовлетворяющие параметрам запроса.");
            }
            else
            {
                MessageForClient(ActionStatus.Success, $"Найдено {resultAnnouncements.Count()} объявлений.");
            }
            return(PartialView("~/Views/Announcement/ListAnnouncement.cshtml", resultAnnouncements));
        }