コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }