/// <summary>
        /// 根据业务实体对象返回对应的视图模型
        /// </summary>
        /// <param name="boId"></param>
        /// <returns></returns>
        public ArticleVM GetVM(Article bo)
        {
            var boVM = new ArticleVM();

            _BoMapToVM(bo, boVM);
            return(boVM);
        }
        /// <summary>
        /// 根据业务实体对象 Id 返回对应的视图模型
        /// </summary>
        /// <param name="boId"></param>
        /// <returns></returns>
        public async Task <ArticleVM> GetVM(Guid id)
        {
            var boVM = new ArticleVM();
            // 初始化数据对象
            var bo = await _boRepository.GetSingleAsyn(id);

            if (bo == null)
            {
                // 缺省的直接创建
                bo        = new Article();
                boVM.Id   = bo.Id;
                boVM.Name = "";
                await SaveBo(boVM);

                bo = await _boRepository.GetSingleAsyn(boVM.Id);
            }

            // 映射基本的属性值
            _BoMapToVM(bo, boVM);

            // 设置供前端下拉选项所需要的数据集合
            await SetRelevanceItems(boVM);

            return(boVM);
        }
        public async Task SetRelevanceItems(ArticleVM boVM)
        {
            // 设置关联的文章附件
            var files = await _businessFileService.GetAllAsyn(x => x.RelevanceObjectID == boVM.Id);

            boVM.FileCollection = new List <BusinessFileVM>();
            foreach (var item in files)
            {
                boVM.FileCollection.Add(new BusinessFileVM(item));
            }

            // 设置关联的栏目
            var tempCollection = await _articleInTopicRepository.GetAllIncludingAsyn(x => x.ArticleTopic, y => y.MasterArticle);

            var articleTopicCollection = from x in tempCollection
                                         where x.MasterArticle.Id == boVM.Id
                                         select x.ArticleTopic;

            boVM.TopicItemIdCollection = new List <string>();
            boVM.TopicItemCollection   = new List <ControlModels.PlainFacadeItem>();
            var topicCollection = await _articleTopicRepository.GetAllAsyn();

            foreach (var topic in topicCollection.OrderBy(x => x.SortCode))
            {
                var item = new PlainFacadeItem()
                {
                    ID = topic.Id.ToString(), Name = topic.Name, IsActive = false
                };
                if (articleTopicCollection.FirstOrDefault(x => x.Id == topic.Id) != null)
                {
                    item.IsActive = true;
                }
                boVM.TopicItemCollection.Add(item);
            }
        }
 /// <summary>
 /// 视图对象的属性转换为业务对象的属性
 /// </summary>
 /// <param name="bo"></param>
 private void _VMMapToBo(Article bo, ArticleVM boVM)
 {
     bo.Id                 = boVM.Id;
     bo.Name               = boVM.Name;
     bo.Description        = boVM.Description;
     bo.SortCode           = boVM.SortCode;
     bo.ArticleSecondTitle = boVM.ArticleSecondTitle;
     bo.ArticleSource      = boVM.ArticleSource;
     bo.ArticleContent     = boVM.ArticleContent;
 }
 /// <summary>
 /// 业务对象的属性转换为视图对象的属性
 /// </summary>
 /// <param name="bo"></param>
 private void _BoMapToVM(Article bo, ArticleVM boVM)
 {
     boVM.Id                 = bo.Id;
     boVM.Name               = bo.Name;
     boVM.Description        = bo.Description;
     boVM.SortCode           = bo.SortCode;
     boVM.ArticleSecondTitle = bo.ArticleSecondTitle;
     boVM.ArticleSource      = bo.ArticleSource;
     boVM.ArticleContent     = bo.ArticleContent;
     boVM.PublishDate        = bo.PublishDate.ToString("yyyy-MM-dd");
     boVM.UpVoteNumber       = bo.UpVoteNumber;
     if (bo.CreatorUser != null)
     {
         boVM.CreateUserName = bo.CreatorUser.ChineseFullName;
     }
 }
        public async Task <bool> SaveBo(ArticleVM boVM)
        {
            var bo = _boRepository.GetSingle(boVM.Id);

            if (bo == null)
            {
                bo = new Article();
            }

            _VMMapToBo(bo, boVM);

            //处理作者用户信息
            if (!String.IsNullOrEmpty(boVM.CreateUserName))
            {
                bo.CreatorUser = await _userManager.FindByNameAsync(boVM.CreateUserName);
            }

            var result = await _boRepository.AddOrEditAndSaveAsyn(bo);

            //处理关联栏目
            if (boVM.TopicItemIdCollection != null)
            {
                var topicCollection = await _articleTopicRepository.GetAllAsyn();

                foreach (var topic in topicCollection)
                {
                    _articleInTopicRepository.DeleteAndSaveBy(x => x.ArticleTopic.Id == topic.Id && x.MasterArticle.Id == bo.Id);
                }
                foreach (var topicIdItem in boVM.TopicItemIdCollection)
                {
                    var topic = await _articleTopicRepository.GetSingleAsyn(Guid.Parse(topicIdItem));

                    var articleInTopic = new ArticleInTopic()
                    {
                        ArticleTopic = topic, MasterArticle = bo
                    };
                    await _articleInTopicRepository.AddOrEditAndSaveAsyn(articleInTopic);
                }
            }

            return(result);
        }
        /// <summary>
        /// 根据列表分页器的参数
        /// </summary>
        /// <param name="listPageParameter"></param>
        /// <param name="boService"></param>
        /// <param name=""></param>
        /// <returns></returns>
        public async Task <List <ArticleVM> > GetboVMCollectionAsyn(ListPageParameter listPageParameter)
        {
            var pageIndex = Int16.Parse(listPageParameter.PageIndex);
            var pageSize  = Int16.Parse(listPageParameter.PageSize);

            var typeID       = "";
            var keyword      = "";
            var typeName     = "所有文章";
            var objectAmount = 0;

            if (!String.IsNullOrEmpty(listPageParameter.ObjectTypeID))
            {
                typeID = listPageParameter.ObjectTypeID;
            }
            if (!String.IsNullOrEmpty(listPageParameter.Keyword))
            {
                keyword = listPageParameter.Keyword;
            }

            #region 1.构建与 keyword 相关的查询 lambda 表达式,用于对查询结果的过滤(给 Where 使用)
            Expression <Func <Article, bool> > predicateExpession = x =>
                                                                    x.Name.Contains(keyword) ||
                                                                    x.ArticleSecondTitle.Contains(keyword) ||
                                                                    x.ArticleContent.Contains(keyword) ||
                                                                    x.Description.Contains(keyword);
            #endregion

            #region 2.根据属性名称确定排序的属性的 lambda 表达式
            var sortPropertyName = listPageParameter.SortProperty;
            var type             = typeof(Article);
            var target           = Expression.Parameter(typeof(object));
            var castTarget       = Expression.Convert(target, type);
            var getPropertyValue = Expression.Property(castTarget, sortPropertyName);
            var sortExpession    = Expression.Lambda <Func <Article, object> >(getPropertyValue, target);
            #endregion

            PaginatedList <Article> boCollection = new PaginatedList <Article>();

            //var roleId = listPageParameter.ObjectTypeID;
            if (String.IsNullOrEmpty(typeID))
            {
                var tempCollection = await _boRepository.GetAllIncludingAsyn(x => x.CreatorUser);

                objectAmount = _boRepository.GetAll().Count();

                if (listPageParameter.SortDesc == "")
                {
                    boCollection = tempCollection.OrderByDescending(sortExpession).AsQueryable().ToPaginatedList(pageIndex, pageSize);
                }
                else
                {
                    boCollection = tempCollection.OrderBy(sortExpession).AsQueryable().ToPaginatedList(pageIndex, pageSize);
                }
            }
            else
            {
                var tempCollection = await _articleInTopicRepository.GetAllIncludingAsyn(x => x.ArticleTopic, y => y.MasterArticle);

                var articleTopic      = _articleTopicRepository.GetSingle(Guid.Parse(typeID));
                var articleCollection = from x in tempCollection
                                        where x.ArticleTopic.Id == articleTopic.Id
                                        select x.MasterArticle;

                typeName     = articleTopic.Name;
                objectAmount = tempCollection.Count();

                if (listPageParameter.SortDesc == "")
                {
                    boCollection = articleCollection.AsQueryable().OrderByDescending(sortExpession).ToPaginatedList(pageIndex, pageSize);
                }
                else
                {
                    boCollection = articleCollection.AsQueryable().OrderBy(sortExpession).ToPaginatedList(pageIndex, pageSize);
                }
            }

            var boVMCollection = new List <ArticleVM>();
            var counter        = 0;
            foreach (var bo in boCollection)
            {
                var boVM = new ArticleVM();
                _BoMapToVM(bo, boVM);
                boVM.OrderNumber = (++counter + (pageIndex - 1) * pageSize).ToString();
                boVMCollection.Add(boVM);
            }


            listPageParameter.PageAmount    = boCollection.TotalPageCount.ToString();
            listPageParameter.ObjectAmount  = boCollection.TotalCount.ToString();
            listPageParameter.PagenateGroup = PagenateGroupRepository.GetItem <Article>(boCollection, 10, pageIndex);
            listPageParameter.Keyword       = keyword;
            listPageParameter.TypeName      = typeName;

            return(boVMCollection);
        }