public ActionResult ProblemList() { // 获取查询参数。 ProblemArchieveQueryParameter query = CreateProblemArchieveQueryParameter(); int page = 1; if (!string.IsNullOrEmpty(Request.QueryString["page"])) { if (!int.TryParse(Request.QueryString["page"], out page)) { page = 1; } } query.EnablePageQuery = true; query.PageQuery = new PageQueryParameter(page, ProblemListItemsPerPage); // 执行分页查询。 IEnumerable <ProblemHandle> queryResult = ProblemArchieveManager.Default.QueryProblems(query); List <ProblemBriefModel> problems = new List <ProblemBriefModel>(); foreach (ProblemHandle handle in queryResult) { problems.Add(ProblemBriefModel.FromProblemHandle(handle)); } return(QueryResult(problems)); }
protected ProblemArchieveQueryParameter CreateProblemArchieveQueryParameter() { ProblemArchieveQueryParameter query = new ProblemArchieveQueryParameter(); if (!string.IsNullOrEmpty(Request.QueryString["title"])) { query.Title = Request.QueryString["title"]; query.QueryByTitle = true; } if (!string.IsNullOrEmpty(Request.QueryString["author"])) { query.Author = Request.QueryString["author"]; query.QueryByAuthor = true; } if (!string.IsNullOrEmpty(Request.QueryString["source"])) { query.Source = Request.QueryString["source"]; query.QueryBySource = true; } if (!string.IsNullOrEmpty(Request.QueryString["origin"])) { try { query.Origin = OJSystemConvert.ConvertFromString(Request.QueryString["origin"]); query.QueryByOrigin = true; } catch (ArgumentException) { } } query.ContestId = -1; query.QueryByContestId = true; return(query); }
public ActionResult ProblemListPages() { ProblemArchieveQueryParameter query = CreateProblemArchieveQueryParameter(); query.EnablePageQuery = true; query.PageQuery = new PageQueryParameter(1, ProblemListItemsPerPage); return(QueryResult(ProblemArchieveManager.Default.QueryPages(query))); }
/// <summary> /// 使用指定的查询对象查询题目句柄。 /// </summary> /// <param name="query">为查询提供参数。</param> /// <returns>一个列表,该列表中包含了所有的查询结果。</returns> /// <exception cref="ArgumentNullException"/> /// <exception cref="ArgumentOutOfRangeException"/> public IList <ProblemHandle> QueryProblems(ProblemArchieveQueryParameter query) { if (query == null) { throw new ArgumentNullException(nameof(query)); } if (query.QueryByTitle && query.Title == null) { throw new ArgumentNullException(nameof(query.Title)); } if (query.QueryBySource && query.Source == null) { throw new ArgumentNullException(nameof(query.Source)); } if (query.QueryByAuthor && query.Author == null) { throw new ArgumentNullException(nameof(query.Author)); } if (query.Page == null) { throw new ArgumentNullException(nameof(query.Page)); } if (query.Page.Page <= 0 || query.Page.EntriesPerPage <= 0) { throw new ArgumentOutOfRangeException(nameof(query.Page)); } IQueryable <ProblemEntity> set = m_context.GetAllProblemEntities(); // 根据查询参数执行相应的查询,动态维护查询基础数据集。 if (query.QueryByTitle) { set = ProblemArchieveDataContext.QueryProblemEntitiesByTitle(set, query.Title); } if (query.QueryBySource) { set = ProblemArchieveDataContext.QueryProblemEntitiesBySource(set, query.Source); } if (query.QueryByAuthor) { set = ProblemArchieveDataContext.QueryProblemEntitiesByAuthor(set, query.Author); } // 执行分页。 set = set.Page(query.Page.Page, query.Page.EntriesPerPage); List <ProblemHandle> handleList = new List <ProblemHandle>(); foreach (ProblemEntity entity in set) { handleList.Add(ProblemHandle.FromProblemEntity(entity)); } return(handleList); }
/// <summary> /// 使用指定的查询对象计算满足条件的数据条目能填充多少页面。 /// </summary> /// <param name="query">查询参数。</param> /// <returns>满足查询条件的数据条目能填充的页面数量。</returns> /// <exception cref="ArgumentNullException"/> /// <exception cref="ArgumentException"/> /// <exception cref="ArgumentOutOfRangeException"/> public int QueryPages(ProblemArchieveQueryParameter query) { if (query == null) { throw new ArgumentNullException(nameof(query)); } if (!query.EnablePageQuery) { throw new ArgumentException("给定的查询参数未启用分页。"); } if (query.PageQuery.ItemsPerPage <= 0) { throw new ArgumentOutOfRangeException(nameof(query.PageQuery.ItemsPerPage)); } return(m_factory.WithContext(context => { IQueryable <ProblemEntity> set = DoQuery(context, query); return set.GetPages(query.PageQuery.ItemsPerPage); })); }
/// <summary> /// 使用指定的查询对象查询题目句柄。 /// </summary> /// <param name="query">为查询提供参数。</param> /// <returns>一个包含了所有的查询结果的查询结果对象。</returns> /// <exception cref="ArgumentNullException"/> /// <exception cref="ArgumentOutOfRangeException"/> public ReadOnlyCollection <ProblemHandle> QueryProblems(ProblemArchieveQueryParameter query) { if (query == null) { throw new ArgumentNullException(nameof(query)); } if (query.QueryByTitle && query.Title == null) { throw new ArgumentNullException(nameof(query.Title)); } if (query.QueryBySource && query.Source == null) { throw new ArgumentNullException(nameof(query.Source)); } if (query.QueryByAuthor && query.Author == null) { throw new ArgumentNullException(nameof(query.Author)); } return(m_factory.WithContext(context => { IQueryable <ProblemEntity> set = DoQuery(context, query); // 对数据集进行排序以准备随时执行分页。 set = set.OrderBy(entity => entity.Id); if (query.EnablePageQuery) { set = set.Page(query.PageQuery); } List <ProblemHandle> handles = new List <ProblemHandle>(); foreach (ProblemEntity ent in set) { handles.Add(ProblemHandle.FromProblemEntity(ent)); } return new ReadOnlyCollection <ProblemHandle>(handles); })); }
private static IQueryable <ProblemEntity> DoQuery(ProblemDataContext context, ProblemArchieveQueryParameter query) { IQueryable <ProblemEntity> set = context.GetAllProblemEntities(); // 根据查询参数执行相应的查询,动态维护查询基础数据集。 if (query.QueryByTitle) { set = ProblemDataContext.QueryProblemEntitiesByTitle(set, query.Title); } if (query.QueryBySource) { set = ProblemDataContext.QueryProblemEntitiesBySource(set, query.Source); } if (query.QueryByAuthor) { set = ProblemDataContext.QueryProblemEntitiesByAuthor(set, query.Author); } if (query.QueryByOrigin) { set = ProblemDataContext.QueryProblemEntitiesByOrigin(set, (NativeOJSystem)query.Origin); } if (query.QueryByContestId) { set = ProblemDataContext.QueryProblemEntitiesByContestId(set, query.ContestId); } return(set); }