/// <summary> /// 根据设定的字段,生成查询重复数据的Lambda,最终返回类似 x=>x.property == val的lambda /// </summary> /// <param name="Entity">要验证字段的实体类</param> /// <param name="para">ParameterExpression</param> /// <returns></returns> public virtual Expression GetExpression(T Entity, ParameterExpression para) { var propName = PropertyHelper.GetPropertyName(_directFieldExp); var prop = PropertyHelper.GetPropertyInfo(_directFieldExp); var func = _directFieldExp.Compile(); var val = func.Invoke(Entity); ////如果字段值为null则跳过,因为一般情况下null值不会被认为重复 //if (val == null) //{ // return res; //} //如果字段值是空字符串,则跳过 if (val is string && val.ToString() == string.Empty) { var requiredAttrs = prop.GetCustomAttributes(typeof(RequiredAttribute), false).ToList(); if (requiredAttrs == null || requiredAttrs.Count == 0) { return(null); } else { var requiredAtt = requiredAttrs[0] as RequiredAttribute; if (requiredAtt.AllowEmptyStrings == true) { return(null); } } } //生成一个表达式,类似于 x=>x.field == val var splits = propName.Split('.'); var idproperty = typeof(T).GetProperties().Where(x => x.Name == splits[0]).FirstOrDefault(); Expression left = Expression.Property(para, idproperty); for (int i = 1; i < splits.Length; i++) { var tempproperty = typeof(T).GetProperties().Where(x => x.Name == splits[i]).FirstOrDefault(); left = Expression.Property(left, tempproperty); } if (val != null && left.Type.IsGeneric(typeof(Nullable <>))) { left = Expression.Property(left, "Value"); } if (left.Type == typeof(string)) { left = Expression.Call(left, typeof(String).GetMethod("Trim", Type.EmptyTypes)); } if (val is string) { val = val.ToString().Trim(); } var right = Expression.Constant(val); var equal = Expression.Equal(left, right); return(equal); }
public static GridAction MakeActionsGroup <T, V>(this IBasePagedListVM <T, V> self , string name , List <GridAction> subActions , params Expression <Func <T, object> >[] whereStr) where T : TopBasePoco where V : ISearcher { var iconcls = string.Empty; var list = new List <string>(); foreach (var item in whereStr) { list.Add(PropertyHelper.GetPropertyName(item)); } return(new GridAction { ButtonId = Guid.NewGuid().ToString(), Name = name, DialogTitle = "", Area = "", ControllerName = "", ActionName = "ActionsGroup", ParameterType = GridActionParameterTypesEnum.NoId, IconCls = iconcls, DialogWidth = 0, DialogHeight = 0, ShowDialog = false, whereStr = list.ToArray(), SubActions = subActions }); }
public SortInfo CreateSortInfo(Expression<Func<TModel, object>> pro, SortDir dir) { SortInfo rv = new SortInfo { Property = PropertyHelper.GetPropertyName(pro), Direction = dir }; return rv; }
/// <summary> /// 处理所有二进制类型的表达式 /// </summary> /// <param name="node">当前表达式节点</param> /// <returns>修改后的表达式</returns> protected override Expression VisitBinary(BinaryExpression node) { //如果表达式是x==y的类型,则获取y的值,并使用x最为key,y的值作为value添加到Dictionary中保存 if (node.NodeType == ExpressionType.Equal) { var pi = PropertyHelper.GetPropertyName(node.Left.NodeType == ExpressionType.Convert ? ((UnaryExpression)node.Left).Operand : node.Left); if (!_rv.ContainsKey(pi)) { _rv.Add(pi, Expression.Lambda(node.Right).Compile().DynamicInvoke()); } } return(base.VisitBinary(node)); }
/// <summary> /// 查找where中是否出现过对于IsValid的判断 /// </summary> /// <param name="node"></param> /// <returns></returns> protected override Expression VisitBinary(BinaryExpression node) { //如果表达式是x==y的类型,则获取y的值,并使用x最为key,y的值作为value添加到Dictionary中保存 if (_mode == 0) { if (node.NodeType == ExpressionType.Equal) { var pi = PropertyHelper.GetPropertyName(node.Left); if (pi.ToLower() == "isvalid") { _needAdd = false; } } } return(base.VisitBinary(node)); }
/// <summary> /// 创建标准动作 /// </summary> /// <typeparam name="T">继承自TopBasePoco的类</typeparam> /// <typeparam name="V">继承自ISearcher的类</typeparam> /// <param name="self">self</param> /// <param name="controllerName">动作的Controller</param> /// <param name="actionName">actionName</param> /// <param name="name">动作名,默认为‘新建’</param> /// <param name="dialogTitle">弹出窗口的标题</param> /// <param name="paraType">paraType</param> /// <param name="areaName">域名</param> /// <param name="dialogWidth">弹出窗口的宽度</param> /// <param name="dialogHeight">弹出窗口的高度</param> /// <param name="buttonId">Button的id 默认自动生成</param> /// <param name="whereStr">whereStr</param> /// <returns>列表动作</returns> /// <remarks> /// 根据标准动作类型,创建默认属性的标准动作 /// </remarks> public static GridAction MakeAction <T, V>(this IBasePagedListVM <T, V> self , string controllerName , string actionName , string name , string dialogTitle , GridActionParameterTypesEnum paraType , string areaName = null , int?dialogWidth = null , int?dialogHeight = null , string buttonId = null , params Expression <Func <T, object> >[] whereStr) where T : TopBasePoco where V : ISearcher { var iconcls = string.Empty; var list = new List <string>(); foreach (var item in whereStr) { list.Add(PropertyHelper.GetPropertyName(item)); } return(new GridAction { ButtonId = buttonId, Name = name, DialogTitle = dialogTitle, Area = areaName, ControllerName = controllerName, ActionName = actionName, ParameterType = paraType, IconCls = iconcls, DialogWidth = dialogWidth ?? 800, DialogHeight = dialogHeight, ShowDialog = true, whereStr = list.ToArray() }); }
/// <summary> /// 创建标准动作 /// </summary> /// <typeparam name="T">继承自TopBasePoco的类</typeparam> /// <typeparam name="V">继承自ISearcher的类</typeparam> /// <param name="self">self</param> /// <param name="controllerName">动作的Controller</param> /// <param name="standardType">标准动作类型</param> /// <param name="dialogTitle">弹出窗口的标题</param> /// <param name="areaName">域名</param> /// <param name="dialogWidth">弹出窗口的宽度</param> /// <param name="dialogHeight">弹出窗口的高度</param> /// <param name="name">动作名,默认为‘新建’</param> /// <param name="buttonId">Button的id 默认自动生成</param> /// <param name="whereStr">whereStr</param> /// <returns>列表动作</returns> /// <remarks> /// 根据标准动作类型,创建默认属性的标准动作 /// </remarks> public static GridAction MakeStandardAction <T, V>(this IBasePagedListVM <T, V> self , string controllerName , GridActionStandardTypesEnum standardType , string dialogTitle , string areaName = null , int?dialogWidth = null , int?dialogHeight = null , string name = null , string buttonId = null , string queryString = null , string urlParampter = null , params Expression <Func <T, object> >[] whereStr) where T : TopBasePoco where V : ISearcher { var iconcls = string.Empty; var actionName = standardType.ToString(); var gridname = string.Empty; var paraType = GridActionParameterTypesEnum.NoId; var showInRow = false; var hideOnToolBar = false; switch (standardType) { case GridActionStandardTypesEnum.Create: iconcls = "layui-icon-add-1"; gridname = "新建"; paraType = GridActionParameterTypesEnum.NoId; break; case GridActionStandardTypesEnum.AddRow: iconcls = "layui-icon-add-1"; gridname = "新建"; paraType = GridActionParameterTypesEnum.AddRow; break; case GridActionStandardTypesEnum.Edit: iconcls = "layui-icon-edit"; gridname = "修改"; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.Delete: iconcls = "layui-icon-delete"; gridname = "删除"; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.RemoveRow: iconcls = "layui-icon-delete"; gridname = "删除"; paraType = GridActionParameterTypesEnum.RemoveRow; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.Details: iconcls = "layui-icon-form"; gridname = string.IsNullOrEmpty(name) ? "详细" : name; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.CustomAction: iconcls = "layui-icon-form"; gridname = string.IsNullOrEmpty(name) ? "自定义" : name; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.BatchEdit: iconcls = "layui-icon-edit"; gridname = "批量修改"; paraType = GridActionParameterTypesEnum.MultiIds; break; case GridActionStandardTypesEnum.BatchDelete: iconcls = "layui-icon-delete"; gridname = "批量删除"; paraType = GridActionParameterTypesEnum.MultiIds; break; case GridActionStandardTypesEnum.Import: iconcls = "layui-icon-templeate-1"; gridname = "导入"; paraType = GridActionParameterTypesEnum.NoId; break; case GridActionStandardTypesEnum.Index: iconcls = "layui-icon-templeate-1"; gridname = name == string.Empty?"跳转":name; paraType = GridActionParameterTypesEnum.IndexUrl; showInRow = true; hideOnToolBar = true; break; default: break; } var list = new List <string>(); foreach (var item in whereStr) { list.Add(PropertyHelper.GetPropertyName(item)); } return(new GridAction { ButtonId = buttonId, Name = (name ?? gridname), DialogTitle = dialogTitle, Area = areaName, ControllerName = controllerName, ActionName = actionName, ParameterType = paraType, QueryString = queryString, UrlParam = urlParampter, IconCls = iconcls, DialogWidth = dialogWidth ?? 800, DialogHeight = dialogHeight, ShowInRow = showInRow, ShowDialog = true, HideOnToolBar = hideOnToolBar, whereStr = list.ToArray() }); }
/// <summary> /// 创建标准动作 /// </summary> /// <typeparam name="T">继承自TopBasePoco的类</typeparam> /// <typeparam name="V">继承自ISearcher的类</typeparam> /// <param name="self">self</param> /// <param name="controllerName">动作的Controller</param> /// <param name="standardType">标准动作类型</param> /// <param name="dialogTitle">弹出窗口的标题,可为空,代表使用默认文字</param> /// <param name="areaName">域名</param> /// <param name="dialogWidth">弹出窗口的宽度</param> /// <param name="dialogHeight">弹出窗口的高度</param> /// <param name="name">按钮显示的文字</param> /// <param name="buttonId">Button的id 默认自动生成</param> /// <param name="whereStr">whereStr</param> /// <returns>列表动作</returns> /// <remarks> /// 根据标准动作类型,创建默认属性的标准动作 /// </remarks> public static GridAction MakeStandardAction <T, V>(this IBasePagedListVM <T, V> self , string controllerName , GridActionStandardTypesEnum standardType , string dialogTitle , string areaName = null , int?dialogWidth = null , int?dialogHeight = null , string name = null , string buttonId = null , params Expression <Func <T, object> >[] whereStr) where T : TopBasePoco where V : ISearcher { var iconcls = string.Empty; var actionName = standardType.ToString(); var gridname = string.Empty; var paraType = GridActionParameterTypesEnum.NoId; var showInRow = false; var hideOnToolBar = false; var showDialog = true; switch (standardType) { case GridActionStandardTypesEnum.Create: iconcls = "layui-icon layui-icon-add-1"; gridname = Program._localizer["Create"]; paraType = GridActionParameterTypesEnum.NoId; break; case GridActionStandardTypesEnum.AddRow: iconcls = "layui-icon layui-icon-add-1"; gridname = Program._localizer["Create"]; paraType = GridActionParameterTypesEnum.AddRow; break; case GridActionStandardTypesEnum.Edit: iconcls = "layui-icon layui-icon-edit"; gridname = Program._localizer["Edit"]; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.Delete: iconcls = "layui-icon layui-icon-delete"; gridname = Program._localizer["Delete"]; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.RemoveRow: iconcls = "layui-icon layui-icon-delete"; gridname = Program._localizer["Delete"]; paraType = GridActionParameterTypesEnum.RemoveRow; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.Details: iconcls = "layui-icon layui-icon-form"; gridname = Program._localizer["Details"]; paraType = GridActionParameterTypesEnum.SingleId; showInRow = true; hideOnToolBar = true; break; case GridActionStandardTypesEnum.BatchEdit: iconcls = "layui-icon layui-icon-edit"; gridname = Program._localizer["BatchEdit"]; paraType = GridActionParameterTypesEnum.MultiIds; break; case GridActionStandardTypesEnum.BatchDelete: iconcls = "layui-icon layui-icon-delete"; gridname = Program._localizer["BatchDelete"]; paraType = GridActionParameterTypesEnum.MultiIds; break; case GridActionStandardTypesEnum.Import: iconcls = "layui-icon layui-icon-templeate-1"; gridname = Program._localizer["Import"]; paraType = GridActionParameterTypesEnum.NoId; break; case GridActionStandardTypesEnum.ExportExcel: iconcls = "layui-icon layui-icon-download-circle"; gridname = Program._localizer["Export"]; paraType = GridActionParameterTypesEnum.MultiIdWithNull; name = Program._localizer["ExportExcel"]; showInRow = false; showDialog = false; hideOnToolBar = false; break; default: break; } if (string.IsNullOrEmpty(dialogTitle)) { dialogTitle = gridname; } var list = new List <string>(); foreach (var item in whereStr) { list.Add(PropertyHelper.GetPropertyName(item)); } return(new GridAction { ButtonId = buttonId, Name = (name ?? gridname), DialogTitle = dialogTitle, Area = areaName, ControllerName = controllerName, ActionName = actionName, ParameterType = paraType, IconCls = iconcls, DialogWidth = dialogWidth ?? 800, DialogHeight = dialogHeight, ShowInRow = showInRow, ShowDialog = showDialog, HideOnToolBar = hideOnToolBar, whereStr = list.ToArray() }); }