Beispiel #1
0
        /// <summary>
        /// 在主题目库中创建一道新题目并返回该题目的句柄。
        /// </summary>
        /// <returns>创建的题目句柄。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="ProblemAlreadyExistException"/>
        public ProblemHandle CreateProblem(string problemId)
        {
            if (problemId == null)
            {
                throw new ArgumentNullException(nameof(problemId));
            }
            if (IsProblemExist(problemId))
            {
                throw new ProblemAlreadyExistException(new ProblemHandle(problemId));
            }

            // 为题目创建文件系统目录。
            string directory = string.Concat(ms_archieveDirectory, "\\", problemId);

            Directory.CreateDirectory(directory);

            ProblemEntity entity = new ProblemEntity()
            {
                Id = problemId,
                ProblemDirectory = directory,
            };

            // 将题目实体对象添加至底层数据库中。
            m_factory.WithContext(context =>
            {
                context.AddProblemEntity(entity);
                context.SaveChanges();
            });

            // 创建句柄并返回。
            ProblemHandle handle = ProblemHandle.FromProblemEntity(entity);

            return(handle);
        }
Beispiel #2
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);
        }
Beispiel #3
0
        /// <summary>
        /// 由给定的题目 ID 获取题目句柄对象。
        /// </summary>
        /// <param name="id">题目 ID。</param>
        /// <returns>具有给定题目 ID 的题目句柄对象。若主题库中不存在这样的题目,返回 null。</returns>
        public ProblemHandle GetProblemById(int id)
        {
            ProblemEntity entity = m_context.GetProblemEntityById(id);

            if (entity == null)
            {
                return(null);
            }

            return(ProblemHandle.FromProblemEntity(entity));
        }
Beispiel #4
0
        /// <summary>
        /// 在主题目库中创建一道新题目并返回该题目的句柄。
        /// </summary>
        /// <returns></returns>
        public ProblemHandle CreateProblem()
        {
            ProblemEntity entity = new ProblemEntity();

            // 为题目创建文件系统目录。
            string directory = string.Concat(ms_archieveDirectory, "\\", entity.Id.ToString("D4"));

            Directory.CreateDirectory(directory);

            // 将题目实体对象添加至底层数据库中。
            m_context.AddProblemEntity(entity);

            // 创建句柄并返回。
            ProblemHandle handle = ProblemHandle.FromProblemEntity(entity);

            return(handle);
        }
Beispiel #5
0
        /// <summary>
        /// 由给定的题目 ID 获取题目句柄对象。
        /// </summary>
        /// <param name="id">题目 ID。</param>
        /// <returns>具有给定题目 ID 的题目句柄对象。若主题库中不存在这样的题目,返回 null。</returns>
        /// <exception cref="ArgumentNullException"/>
        public ProblemHandle GetProblemById(string id)
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            return(m_factory.WithContext(context =>
            {
                ProblemEntity entity = context.GetProblemEntityById(id);
                if (entity == null)
                {
                    return null;
                }
                else
                {
                    return ProblemHandle.FromProblemEntity(entity);
                }
            }));
        }
Beispiel #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);
            }));
        }