CRLExpression RouteExpressionHandler(Expression exp, bool isRight = false, int level = 0) { if (exp is BinaryExpression) { BinaryExpression be = (BinaryExpression)exp; level += 1; return(BinaryExpressionHandler(be.Left, be.Right, be.NodeType, level)); } else if (exp is MemberExpression) { MemberExpression mExp = (MemberExpression)exp; if (isRight)//按表达式右边值 { //var obj = Expression.Lambda(mExp).Compile().DynamicInvoke(); var obj = LambdaCompileCache.GetExpressionCacheValue(mExp); if (obj is Enum) { obj = (int)obj; } return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } //return mExp.Member.Name; return(new CRLExpression() { Type = CRLExpressionType.Name, Data = mExp.Member.Name }); } else if (exp is NewArrayExpression) { #region 数组 NewArrayExpression naExp = (NewArrayExpression)exp; StringBuilder sb = new StringBuilder(); foreach (Expression expression in naExp.Expressions) { sb.AppendFormat(",{0}", RouteExpressionHandler(expression)); } //return sb.Length == 0 ? "" : sb.Remove(0, 1).ToString(); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = sb.Length == 0 ? "" : sb.Remove(0, 1).ToString() }); #endregion } else if (exp is MethodCallExpression) { if (isRight) { //return Expression.Lambda(exp).Compile().DynamicInvoke() + ""; var obj = LambdaCompileCache.GetExpressionCacheValue(exp); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } //按方法调用 MethodCallExpression mcExp = (MethodCallExpression)exp; string methodName = mcExp.Method.Name; string field = ""; List <object> args = new List <object>(); if (mcExp.Object == null) { field = RouteExpressionHandler(mcExp.Arguments[0]).ToString(); } else { field = mcExp.Object.ToString().Split('.')[1]; var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[0]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[0]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 1) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[1]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[1]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 2) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[2]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[2]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 3) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[3]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[3]).Compile().DynamicInvoke()); } var methodCall = string.Format("{0}|{1}|{2}", field, methodName, string.Join(",", args)); return(new CRLExpression() { Type = CRLExpressionType.MethodCall, Data = methodCall }); throw new Exception("暂不支持"); } else if (exp is ConstantExpression) { #region 常量 ConstantExpression cExp = (ConstantExpression)exp; object value; if (cExp.Value == null) { value = null; } else { value = cExp.Value.ToString(); } //return value; return(new CRLExpression() { Type = CRLExpressionType.Value, Data = value }); #endregion } else if (exp is UnaryExpression) { UnaryExpression ue = ((UnaryExpression)exp); level += 1; return(RouteExpressionHandler(ue.Operand, isRight, level)); } return(null); }
public string RouteExpressionHandler(Expression exp, ExpressionType nodeType = ExpressionType.Equal) { if (exp is BinaryExpression) { BinaryExpression be = (BinaryExpression)exp; return(BinaryExpressionHandler(be.Left, be.Right, be.NodeType)); } else if (exp is MemberExpression) { //区分 属性表达带替换符{0} 变量值不带 MemberExpression mExp = (MemberExpression)exp; if (mExp.Expression != null && mExp.Expression.NodeType == ExpressionType.Parameter) //like b.Name==b.Name1 或b.Name { var fieldName = mExp.Member.Name; var type = mExp.Expression.Type; var filed = TypeCache.GetProperties(type, true)[fieldName]; if (filed == null) { throw new Exception("类型 " + type.Name + "." + fieldName + " 不是数据库字段,请检查查询条件"); } if (!string.IsNullOrEmpty(filed.VirtualField))//按虚拟字段 { //如果没有使用$前辍 if (!filed.VirtualField.Contains("$")) { filed.VirtualField = "{VirtualField}" + filed.VirtualField; } return(filed.VirtualField); } var field = "{" + type.FullName + "}" + fieldName; //格式化为别名 if (nodeType == ExpressionType.Not) //like b=!b.IsNew { field += ExpressionTypeCast(nodeType) + 1; } return(field); } var obj = LambdaCompileCache.GetExpressionCacheValue(mExp); if (obj is Enum) { obj = (int)obj; } return(obj + ""); } else if (exp is NewArrayExpression) { #region 数组 NewArrayExpression naExp = (NewArrayExpression)exp; StringBuilder sb = new StringBuilder(); foreach (Expression expression in naExp.Expressions) { sb.AppendFormat(",{0}", RouteExpressionHandler(expression)); } return(sb.Length == 0 ? "" : sb.Remove(0, 1).ToString()); #endregion } else if (exp is MethodCallExpression) { MethodCallExpression mcExp = (MethodCallExpression)exp; if (mcExp.Object is MemberExpression) { var mExp = mcExp.Object as MemberExpression; if (mExp.Expression.NodeType != ExpressionType.Parameter) { //not like b.BarCode.Contains("abc") //按变量或常量编译值 var obj = LambdaCompileCache.GetExpressionCacheValue(exp); return(obj + ""); } } else if (mcExp.Object is ConstantExpression) { //var cExp = mcExp.Object as ConstantExpression; //like b.BarCode == aa() var obj = LambdaCompileCache.GetExpressionCacheValue(exp); return(obj + ""); } var _DBAdapter = DBAdapter.DBAdapterBase.GetDBAdapterBase(dbContext); //var methodAnalyze = new CRL.LambdaQuery.MethodAnalyze(_DBAdapter); var dic = MethodAnalyze.GetMethos(_DBAdapter); #region 方法 //请扩展ExtensionMethod的方法 string methodName = mcExp.Method.Name; parIndex += 1; if (!dic.ContainsKey(methodName)) { //return Expression.Lambda(exp).Compile().DynamicInvoke() + ""; throw new Exception("LambdaQuery不支持方法" + mcExp.Method.Name); } string field = ""; #region par List <object> args = new List <object>(); if (mcExp.Object == null) { field = RouteExpressionHandler(mcExp.Arguments[0]); } else { field = mcExp.Object.ToString().Split('.')[1]; var mExpression = mcExp.Object as MemberExpression; var type = mExpression.Expression.Type; field = "{" + type.FullName + "}" + field; var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[0]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[0]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 1) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[1]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[1]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 2) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[2]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[2]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 3) { var obj = LambdaCompileCache.GetExpressionCacheValue(mcExp.Arguments[3]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[3]).Compile().DynamicInvoke()); } #endregion int newParIndex = parIndex; var result = dic[methodName](field, nodeType, ref newParIndex, AddParame, args.ToArray()); parIndex = newParIndex; return(result); #endregion } else if (exp is ConstantExpression) { #region 常量 ConstantExpression cExp = (ConstantExpression)exp; if (cExp.Value == null) { return("null"); } else { if (cExp.Value is Boolean) { return(Convert.ToInt32(cExp.Value).ToString()); } else if (cExp.Value is Enum) { return(Convert.ToInt32(cExp.Value).ToString()); } return(cExp.Value.ToString()); } #endregion } else if (exp is UnaryExpression) { UnaryExpression ue = ((UnaryExpression)exp); return(RouteExpressionHandler(ue.Operand, ue.NodeType)); } else { throw new Exception("不支持此语法解析:" + exp); } }