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)));
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
            }));
        }
示例#6
0
        /// <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);
            }));
        }
示例#7
0
        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);
        }