Example #1
0
        /// <summary>
        /// 根据主键获取Entity
        /// </summary>
        /// <param name="Id">主键Id</param>
        /// <returns>Entity</returns>
        protected virtual TModel GetById(object Id)
        {
            TModel rv = null;
            //建立基础查询
            var query = DC.Set <TModel>().AsQueryable();

            //循环添加其他设定的Include
            if (_toInclude != null)
            {
                foreach (var item in _toInclude)
                {
                    query = query.Include(item);
                }
            }
            if (typeof(TModel).IsSubclassOf(typeof(PersistPoco)))
            {
                var mod    = new IsValidModifier();
                var newExp = mod.Modify(query.Expression);
                query = query.Provider.CreateQuery <TModel>(newExp) as IOrderedQueryable <TModel>;
            }

            //获取数据
            rv = query.CheckID(Id).AsNoTracking().SingleOrDefault();
            if (rv == null)
            {
                return(rv);
                //throw new Exception("数据不存在");
            }
            //如果TopBasePoco有关联的附件,则自动Include 附件名称
            var fa = typeof(TModel).GetAllProperties().Where(x => x.PropertyType == typeof(FileAttachment)).ToList();

            foreach (var f in fa)
            {
                var fname = DC.GetFKName2 <TModel>(f.Name);
                var fid   = typeof(TModel).GetSingleProperty(fname).GetValue(rv);
                if (fid != null)
                {
                    var fp   = KnifeVirgo.HttpContext.RequestServices.GetRequiredService <VirgoFileProvider>();
                    var file = fp.GetFile(fid?.ToString(), false, DC);
                    rv.SetPropertyValue(f.Name, file);
                }
            }

            return(rv);
        }
        /// <summary>
        /// 进行搜索
        /// </summary>
        public virtual void DoSearch()
        {
            var cmd = GetSearchCommand();

            if (cmd == null)
            {
                IOrderedQueryable <TModel> query = null;
                //根据搜索模式调用不同的函数
                switch (SearcherMode)
                {
                case ListVMSearchModeEnum.Search:
                    query = GetSearchQuery();
                    break;

                case ListVMSearchModeEnum.Export:
                    query = GetExportQuery();
                    break;

                case ListVMSearchModeEnum.Batch:
                    query = GetBatchQuery();
                    break;

                case ListVMSearchModeEnum.MasterDetail:
                    query = GetMasterDetailsQuery();
                    break;

                case ListVMSearchModeEnum.CheckExport:
                    query = GetCheckedExportQuery();
                    break;

                case ListVMSearchModeEnum.Selector:
                    query = GetSelectorQuery();
                    break;

                default:
                    query = GetSearchQuery();
                    break;
                }

                //如果设定了替换条件,则使用替换条件替换Query中的Where语句
                if (ReplaceWhere != null)
                {
                    var mod    = new WhereReplaceModifier <TopBasePoco>(ReplaceWhere);
                    var newExp = mod.Modify(query.Expression);
                    query = query.Provider.CreateQuery <TModel>(newExp) as IOrderedQueryable <TModel>;
                }
                if (Searcher.SortInfo != null)
                {
                    var mod    = new OrderReplaceModifier(Searcher.SortInfo);
                    var newExp = mod.Modify(query.Expression);
                    query = query.Provider.CreateQuery <TModel>(newExp) as IOrderedQueryable <TModel>;
                }
                if (typeof(TModel).IsSubclassOf(typeof(PersistPoco)))
                {
                    var mod    = new IsValidModifier();
                    var newExp = mod.Modify(query.Expression);
                    query = query.Provider.CreateQuery <TModel>(newExp) as IOrderedQueryable <TModel>;
                }
                if (PassSearch == false)
                {
                    //如果需要分页,则添加分页语句
                    if (NeedPage && Searcher.Limit != -1)
                    {
                        //获取返回数据的数量
                        var count = query.Count();
                        if (count < 0)
                        {
                            count = 0;
                        }
                        if (Searcher.Limit == 0)
                        {
                            Searcher.Limit = GlobalConstants.DEFAULT_PAGESIZE;
                        }
                        //根据返回数据的数量,以及预先设定的每页行数来设定数据量和总页数
                        Searcher.Count     = count;
                        Searcher.PageCount = (int)Math.Ceiling((1.0 * Searcher.Count / Searcher.Limit));
                        if (Searcher.Page <= 0)
                        {
                            Searcher.Page = 1;
                        }
                        if (Searcher.PageCount > 0 && Searcher.Page > Searcher.PageCount)
                        {
                            Searcher.Page = Searcher.PageCount;
                        }
                        EntityList = query.Skip((Searcher.Page - 1) * Searcher.Limit).Take(Searcher.Limit).AsNoTracking().ToList();
                    }
                    else //如果不需要分页则直接获取数据
                    {
                        EntityList         = query.AsNoTracking().ToList();
                        Searcher.Count     = EntityList.Count;
                        Searcher.Limit     = EntityList.Count;
                        Searcher.PageCount = 1;
                        Searcher.Page      = 1;
                    }
                }
                else
                {
                    EntityList = query.AsNoTracking().ToList();
                }
            }
            else
            {
                ProcessCommand(cmd);
            }
            IsSearched = true;
            //调用AfterDoSearch函数来处理自定义的后续操作
            AfterDoSearcher();
        }
Example #3
0
        /// <summary>
        /// 查询数据源,并转化成SelectListItem列表
        /// </summary>
        /// <typeparam name="T">数据源类型</typeparam>
        /// <param name="baseQuery">基础查询</param>
        /// <param name="dps">数据权限</param>
        /// <param name="whereCondition">条件语句</param>
        /// <param name="textField">SelectListItem中Text字段对应的值</param>
        /// <param name="valueField">SelectListItem中Value字段对应的值,默认为Id列</param>
        /// <param name="ignorDataPrivilege">忽略数据权限判断</param>
        /// <param name="SortByName">是否根据Text字段排序,默认为是</param>
        /// <returns>SelectListItem列表</returns>
        public static List <ComboSelectListItem> GetSelectListItems <T>(this IQueryable <T> baseQuery
                                                                        , List <DataPrivilege> dps
                                                                        , Expression <Func <T, bool> > whereCondition
                                                                        , Expression <Func <T, string> > textField
                                                                        , Expression <Func <T, string> > valueField = null
                                                                        , bool ignorDataPrivilege = false
                                                                        , bool SortByName         = true)
            where T : TopBasePoco
        {
            var query = baseQuery;

            //如果条件不为空,则拼上条件
            if (whereCondition != null)
            {
                query = query.Where(whereCondition);
            }
            //如果value字段为空,则默认使用Id字段作为value值
            if (valueField == null)
            {
                valueField = x => x.GetID().ToString().ToLower();
            }

            //如果没有指定忽略权限,则拼接权限过滤的where条件
            if (ignorDataPrivilege == false || dps != null)
            {
                query = AppendSelfDPWhere(query, dps);
            }

            if (typeof(T).IsSubclassOf(typeof(PersistPoco)))
            {
                var mod    = new IsValidModifier();
                var newExp = mod.Modify(query.Expression);
                query = query.Provider.CreateQuery <T>(newExp) as IOrderedQueryable <T>;
            }


            //定义PE
            ParameterExpression pe = Expression.Parameter(typeof(T));
            ChangePara          cp = new ChangePara();
            //创建新类,形成类似 new SimpleTextAndValue() 的表达式
            NewExpression newItem = Expression.New(typeof(ComboSelectListItem));

            //绑定Text字段,形成类似 Text = textField 的表达式
            var           textMI   = typeof(ComboSelectListItem).GetMember("Text")[0];
            MemberBinding textBind = Expression.Bind(textMI, cp.Change(textField.Body, pe));


            //绑定Value字段,形成类似 Value = valueField 的表达式
            var           valueMI   = typeof(ComboSelectListItem).GetMember("Value")[0];
            MemberBinding valueBind = Expression.Bind(valueMI, cp.Change(valueField.Body, pe));

            //如果是树形结构,给ParentId赋值
            MemberBinding parentBind = null;
            var           parentMI   = typeof(ComboSelectListItem).GetMember("ParentId")[0];

            if (typeof(ITreeData <T>).IsAssignableFrom(typeof(T)))
            {
                var parentMember = Expression.MakeMemberAccess(pe, typeof(ITreeData).GetProperty("ParentId"));
                var p            = Expression.Call(parentMember, "ToString", new Type[] { });
                var p1           = Expression.Call(p, "ToLower", new Type[] { });
                parentBind = Expression.Bind(parentMI, p1);
            }
            else
            {
                parentBind = Expression.Bind(parentMI, Expression.Constant(string.Empty));
            }

            //合并创建新类和绑定字段的表达式,形成类似 new SimpleTextAndValue{ Text = textField, Value = valueField} 的表达式
            MemberInitExpression init = Expression.MemberInit(newItem, textBind, valueBind, parentBind);

            //将最终形成的表达式转化为Lambda,形成类似 x=> new SimpleTextAndValue { Text = x.textField, Value = x.valueField} 的表达式
            var lambda = Expression.Lambda <Func <T, ComboSelectListItem> >(init, pe);


            List <ComboSelectListItem> rv = new List <ComboSelectListItem>();

            //根据Text对下拉菜单数据排序
            if (SortByName == true)
            {
                rv = query.Select(lambda).OrderBy(x => x.Text).ToList();
            }
            else
            {
                rv = query.Select(lambda).ToList();
            }

            return(rv);
        }
Example #4
0
        /// <summary>
        /// 查询数据源,并转化成TreeSelectListItem列表
        /// </summary>
        /// <typeparam name="T">数据源类型</typeparam>
        /// <param name="baseQuery">基础查询</param>
        /// <param name="knifeVirgo">context</param>
        /// <param name="whereCondition">条件语句</param>
        /// <param name="textField">表达式用来获取Text字段对应的值</param>
        /// <param name="valueField">表达式用来获取Value字段对应的值,不指定则默认使用Id字段</param>
        /// <param name="iconField">表达式用来获取icon字段对应的值</param>
        /// <param name="urlField">表达式用来获取Url字段对应的值</param>
        /// <param name="tagField">表达式用来获取Tag字段对应的值</param>
        /// <param name="expandField">表达式用来获取Expanded字段对应的值,指示节点是否展开</param>
        /// <param name="ignorDataPrivilege">忽略数据权限判断</param>
        /// <param name="SortByName">是否根据Text字段排序,默认为是</param>
        /// <returns>SelectListItem列表</returns>
        public static List <TreeSelectListItem> GetTreeSelectListItems <T>(this IQueryable <T> baseQuery
                                                                           , VirgoContext knifeVirgo
                                                                           , Expression <Func <T, string> > textField
                                                                           , Expression <Func <T, string> > valueField = null
                                                                           , Expression <Func <T, string> > iconField  = null
                                                                           , Expression <Func <T, string> > urlField   = null
                                                                           , Expression <Func <T, string> > tagField   = null
                                                                           , Expression <Func <T, bool> > expandField  = null
                                                                           , bool ignorDataPrivilege = false
                                                                           , bool SortByName         = true)
            where T : TreePoco
        {
            var dps   = knifeVirgo?.LoginUserInfo?.DataPrivileges;
            var query = baseQuery.AsNoTracking();

            //如果没有指定忽略权限,则拼接权限过滤的where条件
            if (ignorDataPrivilege == false)
            {
                query = AppendSelfDPWhere(query, knifeVirgo, dps);
            }
            if (typeof(IPersistPoco).IsAssignableFrom(typeof(T)))
            {
                var mod    = new IsValidModifier();
                var newExp = mod.Modify(query.Expression);
                query = query.Provider.CreateQuery <T>(newExp) as IOrderedQueryable <T>;
            }

            //处理后面要使用的expression
            //if (valueField == null)
            //{
            valueField = x => x.GetID().ToString().ToLower();
            //}
            Expression <Func <T, string> > parentField = x => x.ParentId.ToString().ToLower();

            //定义PE
            ParameterExpression pe = Expression.Parameter(typeof(T));
            ChangePara          cp = new ChangePara();

            //创建新类,形成类似 new SimpleTreeTextAndValue() 的表达式
            NewExpression newItem = Expression.New(typeof(TreeSelectListItem));

            //绑定Text字段,形成类似 Text = textField 的表达式
            var           textMI   = typeof(TreeSelectListItem).GetMember("Text")[0];
            MemberBinding textBind = Expression.Bind(textMI, cp.Change(textField.Body, pe));

            //绑定Value字段,形成类似 Value = valueField 的表达式
            var           valueMI   = typeof(TreeSelectListItem).GetMember("Id")[0];
            MemberBinding valueBind = Expression.Bind(valueMI, cp.Change(valueField.Body, pe));

            //绑定ParentId字段,形成类似 Value = valueField 的表达式
            var           parentMI   = typeof(TreeSelectListItem).GetMember("ParentId")[0];
            MemberBinding parentBind = Expression.Bind(parentMI, cp.Change(parentField.Body, pe));

            //绑定Url字段,形成类似 Value = valueField 的表达式
            MemberBinding urlBind = null;
            var           urlMI   = typeof(TreeSelectListItem).GetMember("Url")[0];

            if (urlField != null)
            {
                urlBind = Expression.Bind(urlMI, cp.Change(urlField.Body, pe));
            }
            else
            {
                urlBind = Expression.Bind(urlMI, Expression.Constant(string.Empty));
            }

            //绑定icon字段,形成类似 ICon = iconField 的表达式
            MemberBinding iconBind = null;
            var           iconMI   = typeof(TreeSelectListItem).GetMember("ICon")[0];

            if (iconField != null)
            {
                iconBind = Expression.Bind(iconMI, cp.Change(iconField.Body, pe));
            }
            else
            {
                iconBind = Expression.Bind(iconMI, Expression.Constant(string.Empty));
            }

            //绑定Tag字段,形成类似 Value = valueField 的表达式
            MemberBinding tagBind = null;
            var           tagMI   = typeof(TreeSelectListItem).GetMember("Tag")[0];

            if (tagField != null)
            {
                tagBind = Expression.Bind(tagMI, cp.Change(tagField.Body, pe));
            }
            else
            {
                tagBind = Expression.Bind(tagMI, Expression.Constant(""));
            }

            //绑定Tag字段,形成类似 Value = valueField 的表达式
            MemberBinding expandBind = null;
            var           expandMI   = typeof(TreeSelectListItem).GetMember("Expended")[0];

            if (expandField != null)
            {
                expandBind = Expression.Bind(expandMI, cp.Change(expandField.Body, pe));
            }
            else
            {
                expandBind = Expression.Bind(expandMI, Expression.Constant(false));
            }

            //合并创建新类和绑定字段的表达式,形成类似 new SimpleTextAndValue{ Text = textField, Value = valueField} 的表达式
            MemberInitExpression init = Expression.MemberInit(newItem, textBind, valueBind, iconBind, parentBind, urlBind, tagBind, expandBind);

            //将最终形成的表达式转化为Lambda,形成类似 x=> new SimpleTextAndValue { Text = x.textField, Value = x.valueField} 的表达式
            var lambda = Expression.Lambda <Func <T, TreeSelectListItem> >(init, pe);

            List <TreeSelectListItem> rv = null;

            //根据Text对下拉菜单数据排序
            if (SortByName == true)
            {
                rv = query.Select(lambda).OrderBy(x => x.Text).ToList();
            }
            else
            {
                rv = query.Select(lambda).ToList();
            }

            rv.ForEach(x =>
            {
                x.Children = rv.Where(y => y.ParentId == x.Id).ToList();
            });
            return(rv.Where(x => string.IsNullOrEmpty(x.ParentId)).ToList());
        }