/// <summary> /// 获取与给定的 <see cref="ProblemSortKey"/> 值相对应的排序成员定义。 /// </summary> /// <param name="key">排序键。</param> /// <returns>排序成员定义。</returns> /// <exception cref="ArgumentException">给定的 <see cref="ProblemSortKey"/> 值无效。</exception> public static FieldDefinition <Problem> GetField(this ProblemSortKey key) { LambdaExpression selector; switch (key) { case ProblemSortKey.ArchiveId: selector = (Expression <Func <Problem, int?> >)(p => p.ArchiveId); break; case ProblemSortKey.CreationTime: selector = (Expression <Func <Problem, DateTime> >)(p => p.CreationTime); break; case ProblemSortKey.LastUpdateTime: selector = (Expression <Func <Problem, DateTime> >)(p => p.LastUpdateTime); break; case ProblemSortKey.Difficulty: selector = (Expression <Func <Problem, int> >)(p => p.Difficulty); break; case ProblemSortKey.TotalSubmissions: selector = (Expression <Func <Problem, int> >)(p => p.TotalSubmissions); break; case ProblemSortKey.AcceptedSubmissions: selector = (Expression <Func <Problem, int> >)(p => p.AcceptedSubmissions); break; case ProblemSortKey.TotalAttemptedUsers: selector = (Expression <Func <Problem, int> >)(p => p.TotalAttemptedUsers); break; case ProblemSortKey.TotalSolvedUsers: selector = (Expression <Func <Problem, int> >)(p => p.TotalSolvedUsers); break; case ProblemSortKey.LastSubmissionTime: selector = (Expression <Func <Problem, DateTime> >)(p => p.LastSubmissionTime); break; default: throw new ArgumentException("Invalid sort key for problems: " + key, nameof(key)); } return(new ExpressionFieldDefinition <Problem>(selector)); }
public async Task <PaginatedListActionResult <ProblemListInfo> > GetProblemList( [FromQuery] ProblemSortKey by = ProblemSortKey.ArchiveId, [FromQuery] bool descend = false, [FromQuery][Page] int page = 0, [FromQuery][ItemsPerPage] int itemsPerPage = 20) { var findPipeline = new ProblemFindPipeline(new ProblemFilterBuilder().InArchive(true)) { SortKey = by, SortByDescending = descend, Pagination = new Pagination(page, itemsPerPage) }; var findResult = await _repo.Problems.FindManyAsync(findPipeline); var models = findResult.ResultSet.Select(p => _mapper.Map <Problem, ProblemListInfo>(p)); return(findResult.TotalCount, models); }
public async Task <PaginatedListActionResult <ProblemListInfo> > GetProblems( [FromQuery] ProblemSortKey by = ProblemSortKey.CreationTime, [FromQuery] bool descend = true, [FromQuery][Range(0, int.MaxValue)] int page = 0, [FromQuery][Range(1, int.MaxValue)] int itemsPerPage = 20) { var findPipeline = new ProblemFindPipeline(ProblemFilterBuilder.Empty) { SortKey = by, SortByDescending = descend, Pagination = new Pagination(page, itemsPerPage) }; var findResult = await _repo.Problems.FindManyAsync(findPipeline); var models = findResult.ResultSet.Select(e => _mapper.Map <Problem, ProblemListInfo>(e)); return(findResult.TotalCount, models); }