async Task LoadOptionsAsync(QuestionsIndexModel model)
        {
            //Subjects
            var subjects = await _subjectsService.FetchAsync();

            subjects = subjects.GetOrdered();

            _subjectsService.LoadSubItems(subjects);
            foreach (var item in subjects)
            {
                item.GetSubIds();
            }

            model.Subjects = subjects.MapViewModelList(_mapper);


            //Recruits
            var recruits = await _recruitsService.FetchAsync();

            recruits = recruits.GetOrdered();

            _recruitsService.LoadSubItems(recruits);
            model.Recruits = recruits.MapViewModelList(_mapper);
        }
        public async Task <ActionResult> Index(int subject, int term = 0, int recruit = 0, string keyword = "", int page = 1, int pageSize = 10)
        {
            if (page < 1)
            {
                var model = new QuestionsIndexModel();
                await LoadOptionsAsync(model);

                return(Ok(model));
            }


            Subject selectedSubject = _subjectsService.GetById(subject);

            if (selectedSubject == null)
            {
                ModelState.AddModelError("subject", "科目不存在");
                return(BadRequest(ModelState));
            }

            Term selectedTerm         = null;
            ICollection <int> termIds = null;

            if (term > 0)
            {
                selectedTerm = _termsService.GetById(term);
                if (selectedTerm == null)
                {
                    ModelState.AddModelError("term", "條文不存在");
                    return(BadRequest(ModelState));
                }

                termIds = selectedTerm.GetSubIds();
                termIds.Add(selectedTerm.Id);
            }

            var allRecruits = await _recruitsService.GetAllAsync();

            Recruit    selectedRecruit = null;
            List <int> recruitIds      = new List <int>();

            if (recruit > 0)
            {
                selectedRecruit = allRecruits.FirstOrDefault(x => x.Id == recruit);

                if (selectedRecruit == null)
                {
                    ModelState.AddModelError("recruit", "招考年度不存在");
                    return(BadRequest(ModelState));
                }

                recruitIds.Add(recruit);
                if (selectedRecruit.RecruitEntityType == RecruitEntityType.SubItem)
                {
                    var partIds = allRecruits.Where(x => x.ParentId == recruit).Select(part => part.Id);
                    recruitIds.AddRange(partIds.ToList());
                    recruitIds.Add(recruit);
                }
            }

            var questions = await _questionsService.FetchAsync(selectedSubject, termIds, recruitIds);

            if (questions.IsNullOrEmpty())
            {
                return(Ok(questions.GetPagedList(_mapper, page, pageSize)));
            }

            var keywords = keyword.GetKeywords();

            if (keywords.HasItems())
            {
                questions = questions.FilterByKeyword(keywords);
            }


            List <Term>       allTerms    = (await _termsService.FetchAllAsync()).ToList();
            List <UploadFile> attachments = (await _attachmentsService.FetchAsync(PostType.Option)).ToList();

            var pagedList = questions.GetPagedList(_mapper, allRecruits.ToList(), attachments, allTerms, page, pageSize);

            foreach (var item in pagedList.ViewList)
            {
                item.Options = item.Options.OrderByDescending(o => o.Correct).ToList();
            }


            return(Ok(pagedList));
        }