public async Task <PagedResultDto <QuestionListEntryDto> > SearchForQuestions([FromBody] SearchQParametersDto parameters) { return(await _questionService.SearchForQuestionsAsync(parameters)); }
public async Task <PagedResultDto <QuestionListEntryDto> > SearchForQuestionsAsync(SearchQParametersDto parameters) { IQueryable <Question> queryBeforeSkipAndTake = _context.Questions .OrderBy(x => x.Title) .ThenBy(x => x.Id); if (!string.IsNullOrWhiteSpace(parameters.Title)) { queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.Title.Contains(parameters.Title)); } if (parameters.AndTags.Any()) { IList <int> tagids = parameters.AndTags.Select(x => x.Id).ToList(); foreach (int tagId in tagids) { queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.RelTags.Any(rel => rel.Tag.Id == tagId)); } } if (parameters.OrTags.Any()) { IList <int> tagids = parameters.OrTags.Select(x => x.Id).ToList(); queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.RelTags.Any(rel => tagids.Contains(rel.Tag.Id))); } if (parameters.Language.HasValue) { queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.Language == parameters.Language); } if (parameters.StatusCreated || parameters.StatusReleased || parameters.StatusObsolete) { queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.Status == QuestionStatus.Created && parameters.StatusCreated || x.Status == QuestionStatus.Released && parameters.StatusReleased || x.Status == QuestionStatus.Obsolete && parameters.StatusObsolete); } else { queryBeforeSkipAndTake = queryBeforeSkipAndTake.Where(x => x.Status == QuestionStatus.Created || x.Status == QuestionStatus.Released); } PagedResultDto <QuestionListEntryDto> result = await ToPagedResult(queryBeforeSkipAndTake, parameters.Page, MaterializeQuestionList); return(result); }