Exemplo n.º 1
0
        CRLExpression.CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false)
        {
            #region methodCall
            MethodCallExpression mcExp = (MethodCallExpression)exp;
            var        arguments       = new List <object>();
            var        allArguments    = mcExp.Arguments;
            int        argsIndex       = 0;
            Expression firstArgs;
            bool       isLambdaQueryJoinExt = false;
            if (mcExp.Method.IsStatic)       //区分静态方法还是实例方法
            {
                firstArgs = allArguments[0]; //like b.Name.IsNull("22")
                argsIndex = 1;
                if (firstArgs.Type.Name.Contains("LambdaQueryJoin"))
                {
                    isLambdaQueryJoinExt = true;
                }
            }
            else
            {
                firstArgs = mcExp.Object;//like b.Id.ToString()
            }

            #region 缓存处理 效率并不高
            //MethodCallExpressionCacheItem methodCache;
            //string key = "";
            //if (SettingConfig.UseLambdaCache&& false)
            //{
            //    key = __PrefixsAllKey + mcExp + nodeType;
            //    var exists = MethodCallExpressionCache.TryGetValue(key, out methodCache);
            //    if (exists)
            //    {
            //        if (!methodCache.isConstantMethod)
            //        {
            //            var methodCall = methodCache.CRLExpression.Data as CRLExpression.MethodCallObj;
            //            if (methodCall.Args.Count > 0)
            //            {
            //                for (int i = argsIndex; i < allArguments.Count; i++)
            //                {
            //                    bool isConstant1;
            //                    var obj = GetParameExpressionValue(allArguments[i], out isConstant1);
            //                    arguments.Add(obj);
            //                }
            //                methodCall.Args = arguments;
            //            }
            //        }
            //        methodCache.CRLExpression.SqlOut = "";
            //        return methodCache.CRLExpression;
            //    }
            //}
            #endregion
            #region MethodCallExpression
            //bool isConstantMethod = false;

            MemberExpression memberExpression;

            string methodField = "";
            string memberName  = "";
            string methodName  = mcExp.Method.Name;

            if (firstArgs is ParameterExpression || isLambdaQueryJoinExt)
            {
                var exp2 = mcExp.Arguments[1] as UnaryExpression;
                var type = exp2.Operand.GetType();
                var p    = type.GetProperty("Body");
                var exp3 = p.GetValue(exp2.Operand, null) as Expression;
                methodField = RouteExpressionHandler(exp3).SqlOut;
                memberName  = "";
            }
            else if (firstArgs is UnaryExpression)//like a.Code.Count()
            {
                memberExpression = (firstArgs as UnaryExpression).Operand as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var field = TypeCache.GetProperties(memberExpression.Expression.Type, true)[memberName];
                memberName  = __DBAdapter.FieldNameFormat(field);
                methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
            }
            else if (firstArgs is BinaryExpression)
            {
                var be = firstArgs as BinaryExpression;
                methodField = BinaryExpressionHandler(be.Left, be.Right, be.NodeType).Data.ToString();
            }
            else if (firstArgs is MemberExpression)
            {
                //like a.Code
                memberExpression = firstArgs as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var type = memberExpression.Expression.Type;
                if (type.IsSubclassOf(typeof(IModel)))
                {
                    var field = TypeCache.GetProperties(type, true)[memberExpression.Member.Name];
                    memberName = __DBAdapter.FieldNameFormat(field);
                }
                if (memberExpression.Expression.NodeType == ExpressionType.Parameter)
                {
                    methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
                    //var allConstant = true;
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj);
                    }
                }
                else
                {
                    //like Convert.ToDateTime(times)
                    var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                    arguments.Add(obj);
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj2 = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj2);
                    }
                }
            }
            else if (firstArgs is ConstantExpression)//按常量
            {
                //like DateTime.Parse("2016-02-11 12:56"),
                //isConstantMethod = true;
                var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                arguments.Add(obj);
            }
            //else
            //{
            //    throw new CRLException("不支持此语法解析:" + args);
            //}

            if (nodeType == null)
            {
                nodeType = ExpressionType.Equal;
            }
            if (string.IsNullOrEmpty(methodField))
            {
                //当是常量转换方法

                var    method = mcExp.Method;
                object obj;
                if (mcExp.Method.IsStatic)//like DateTime.Parse("2016-02-11")
                {
                    obj = method.Invoke(null, arguments.ToArray());
                }
                else//like time.AddDays(1)
                {
                    if (arguments.Count == 0)
                    {
                        throw new Exception("未能解析" + exp);
                    }
                    var args1 = arguments.First();
                    arguments.RemoveAt(0);
                    obj = method.Invoke(args1, arguments.ToArray());
                }
                var exp2 = new CRLExpression.CRLExpression()
                {
                    Type = CRLExpression.CRLExpressionType.Value, Data = obj
                };
                //var cache = new MethodCallExpressionCacheItem() { CRLExpression = exp2, argsIndex = argsIndex, isConstantMethod = isConstantMethod, isStatic = mcExp.Method.IsStatic };
                //MethodCallExpressionCache[key] = cache;
                return(exp2);
            }
            var methodInfo = new CRLExpression.MethodCallObj()
            {
                Args = arguments, ExpressionType = nodeType.Value, MemberName = memberName, MethodName = methodName, MemberQueryName = methodField
            };
            methodInfo.ReturnType = mcExp.Type;
            #endregion
            var exp4 = new CRLExpression.CRLExpression()
            {
                Type = CRLExpression.CRLExpressionType.MethodCall, Data = methodInfo
            };
            //if (SettingConfig.UseLambdaCache && false)
            //{
            //    var cache2 = new MethodCallExpressionCacheItem() { CRLExpression = exp4, argsIndex = argsIndex, isConstantMethod = isConstantMethod };
            //    MethodCallExpressionCache[key] = cache2;
            //}
            return(exp4);

            #endregion
        }
Exemplo n.º 2
0
        private Expression Comparison()
        {
            var left = Additive();

            while (CurrentTokenKind == QueryExpressionTokenKind.Keyword)
            {
                var op = (string)TokenData;

                ExpressionType?expression = null;
                switch (op.ToLowerInvariant())
                {
                case "eq":
                    expression = ExpressionType.Equal;
                    break;

                case "ne":
                    expression = ExpressionType.NotEqual;
                    break;

                case "gt":
                    expression = ExpressionType.GreaterThan;
                    break;

                case "ge":
                    expression = ExpressionType.GreaterThanOrEqual;
                    break;

                case "lt":
                    expression = ExpressionType.LessThan;
                    break;

                case "le":
                    expression = ExpressionType.LessThanOrEqual;
                    break;

                case "has":
                    NextToken();
                    var flag = Expression.Convert(Additive(), typeof(Enum));
                    left = Expression.Call(null, HasFlagMethodInfo, left, flag);
                    return(left);

                case "in":
                    NextToken();
                    var collection = List(left.Type) ?? CommonExpr();
                    // TODO: cache
                    left = Expression.Call(null, ContainsMethodInfo.MakeGenericMethod(left.Type), collection, left);
                    return(left);
                }

                if (expression == null)
                {
                    break;
                }

                NextToken();
                var right = Additive();
                left = Expression.MakeBinary(expression.Value, Promote(left, right), Promote(right, left));
            }

            return(left);
        }
        /// <summary>
        /// 访问常量
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        protected override Expression VisitConstant(ConstantExpression c)
        {
            //如果左值是访问成员,类似与p=>p.ID == 1
            if (m_left != null && m_left.NodeType == ExpressionType.MemberAccess)
            {
                //in操作无法参数化,如果value是数组
                if (c.Type.IsArray)
                {
                    Array  array = (Array)c.Value;
                    string str   = string.Empty;
                    foreach (var o in array)
                    {
                        switch (Type.GetTypeCode(o.GetType()))
                        {
                        case TypeCode.Boolean:
                            str += (bool)o ? "1" : "0";
                            break;

                        case TypeCode.DateTime:
                            str += string.Format("'{0}'", ((DateTime)o).ToString("yyyy-MM-dd HH:mm:ss"));
                            break;

                        case TypeCode.String:
                        case TypeCode.Object:                                //guid
                            str += string.Format("'{0}'", o);
                            break;

                        default:
                            str += o.ToString();
                            break;
                        }
                        str += ",";
                    }
                    this.Write(str.TrimEnd(','));
                }
                else
                {
                    this.Write("@p" + m_parameters.Count);
                    m_parameters.Add(c.Value);
                    if (c.Value == null)                      //如果value为null
                    {
                        MemberExpression member = (MemberExpression)m_left;
                        if (m_binaryType.HasValue)
                        {
                            switch (m_binaryType)
                            {
                            case ExpressionType.Equal:
                                this.Write(string.Format(" OR [{0}] IS NULL", member.Member.Name));
                                break;

                            case ExpressionType.NotEqual:
                                this.Write(string.Format(" OR [{0}] IS NOT NULL", member.Member.Name));
                                break;
                            }
                            m_binaryType = null;
                        }
                    }
                }
            }
            else
            {
                //如果存在p => true或者p => false
                if (c.Value.Equals(true))
                {
                    this.Write("1=1");
                }
                else if (c.Value.Equals(false))
                {
                    this.Write("1=0");
                }
            }
            //访问完右值之后清空左值
            m_left = null;
            return(c);
        }
Exemplo n.º 4
0
        public void Add(string leftOperand, ExpressionType optr, string rightOperand, bool isParametized = false, ExpressionType?linkingOperator = null)
        {
            var unit = new PredicateUnit
            {
                LeftOperand             = leftOperand,
                Operator                = optr,
                RightOperand            = rightOperand,
                IsRightOperandParameter = isParametized,
                LinkingOperator         = linkingOperator
            };

            predicateUnits.Add(unit);
        }
Exemplo n.º 5
0
        internal IQuery <TEntity> Where(string leftOperand, ExpressionType predicateOperator, string rightOperand, bool isParametized = false, ExpressionType?linkingOperator = null)
        {
            if (this.PredicateParts == null)
            {
                this.PredicateParts = new PredicateUnits();
            }

            var parameterName = string.Empty;

            if (isParametized)
            {
                parameterName = this.ParameterNameGenerator.GetNextParameterName("param");

                Parameters.Add(parameterName, rightOperand);
                this.PredicateParts.Add(leftOperand, predicateOperator, parameterName, isParametized, linkingOperator);
            }
            else
            {
                this.PredicateParts.Add(leftOperand, predicateOperator, rightOperand, isParametized, linkingOperator);
            }

            return(this);
        }
Exemplo n.º 6
0
        protected override Expression VisitConstant(ConstantExpression c)
        {
            //如果左值是访问成员,类似与p=>p.ID == 1
            if (m_left != null && m_left.NodeType == ExpressionType.MemberAccess)
            {
                if (c.Value == null)
                {
                    this.Write("NULL");
                    MemberExpression member = (MemberExpression)m_left;
                    if (m_binaryType.HasValue)
                    {
                        switch (m_binaryType)
                        {
                        case ExpressionType.Equal:
                            this.Write(string.Format(" OR [{0}] IS NULL", member.Member.Name));
                            break;

                        case ExpressionType.NotEqual:
                            this.Write(string.Format(" OR [{0}] IS NOT NULL", member.Member.Name));
                            break;
                        }
                        m_binaryType = null;
                    }
                }
                else if (c.Type == typeof(DateTime) || c.Type == typeof(Guid))
                {
                    this.Write("'");                    //new DateTime(\"
                    this.Write(c.Value.ToString());
                    this.Write("'");                    //\"
                }
                else if (c.Type.IsArray)                //如果value是数组
                {
                    Array  array = (Array)c.Value;
                    string str   = string.Empty;
                    foreach (var o in array)
                    {
                        switch (Type.GetTypeCode(o.GetType()))
                        {
                        case TypeCode.Boolean:
                            str += (bool)o ? "1" : "0";
                            break;

                        case TypeCode.DateTime:
                            str += string.Format("'{0}'", ((DateTime)o).ToString("yyyy-MM-dd HH:mm:ss"));
                            break;

                        case TypeCode.String:
                        case TypeCode.Object:
                            str += string.Format("'{0}'", o);
                            break;

                        default:
                            str += o.ToString();
                            break;
                        }
                        str += ",";
                    }
                    this.Write(str.TrimEnd(','));
                }
                else
                {
                    switch (Type.GetTypeCode(c.Value.GetType()))
                    {
                    case TypeCode.Boolean:
                        this.Write(((bool)c.Value) ? "1" : "0");
                        break;

                    case TypeCode.Single:
                    case TypeCode.Double:
                        string str = c.Value.ToString();
                        if (!str.Contains('.'))
                        {
                            str += ".0";
                        }
                        this.Write(str);
                        break;

                    case TypeCode.DateTime:
                        this.Write("'");                                //new DateTime(\"
                        this.Write(c.Value.ToString());
                        this.Write("'");                                //\"
                        break;

                    case TypeCode.String:
                        this.Write("'");
                        this.Write(c.Value.ToString().Replace("'", "\""));
                        this.Write("'");
                        break;

                    default:
                        this.Write(c.Value.ToString());
                        break;
                    }
                }
            }
            else
            {
                //如果存在p => true或者p => false
                if (c.Value.Equals(true))
                {
                    this.Write("1=1");
                }
                else if (c.Value.Equals(false))
                {
                    this.Write("1=0");
                }
            }
            m_left = null;
            return(c);
        }
Exemplo n.º 7
0
 public static IEnumerable <TExpression> GetExpressions <TExpression>(this IEnumerable <Expression> source, ExpressionType?type = null) where TExpression : Expression
 {
     if (source == null)
     {
         throw new ArgumentNullException(nameof(source));
     }
     foreach (var expr in source)
     {
         var texpr = expr as TExpression;
         if (texpr != null && (type == null || texpr.NodeType == type))
         {
             yield return(texpr);
         }
     }
 }
Exemplo n.º 8
0
        protected void VisitCallExpression(Expression expression, ExpressionType?parentNodeType = null)
        {
            var  m            = (MethodCallExpression)expression;
            bool evaluateCall = true;

            if (Members != null && Members.Any() && m.Object is MemberExpression)
            {
                var memberExp = m.Object as MemberExpression;
                var rootType  = ReflectionHelper.RootTypeForExpression(memberExp);

                var like   = "LIKE";
                var concat = " + ";

                if (rootType != null && rootType.Equals(this.Type))
                {
                    if (m.Method.DeclaringType == typeof(string))
                    {
                        switch (m.Method.Name)
                        {
                        case "StartsWith":
                            Buffer.Append("(");
                            this.Visit(m.Object);
                            Buffer.Append(String.Format(" {0} ", like));
                            this.Visit(m.Arguments[0]);
                            Buffer.Append(String.Format(" {0} '%')", concat));
                            return;

                        case "EndsWith":
                            Buffer.Append("(");
                            this.Visit(m.Object);
                            Buffer.Append(String.Format(" {0} '%' {1} ", like, concat));
                            this.Visit(m.Arguments[0]);
                            Buffer.Append(")");
                            return;

                        case "Contains":
                            Buffer.Append("(");
                            this.Visit(m.Object);
                            Buffer.Append(String.Format(" {0} '%' {1} ", like, concat));
                            this.Visit(m.Arguments[0]);
                            Buffer.Append(String.Format(" {0} '%')", concat));
                            return;

                        case "ToUpper":
                            Buffer.Append("UPPER(");
                            this.Visit(m.Object);
                            Buffer.Append(")");
                            return;

                        case "ToLower":
                            Buffer.Append("LOWER(");
                            this.Visit(m.Object);
                            Buffer.Append(")");
                            return;

                        case "Replace":
                            Buffer.Append("REPLACE(");
                            this.Visit(m.Object);
                            Buffer.Append(", ");
                            this.Visit(m.Arguments[0]);
                            Buffer.Append(", ");
                            this.Visit(m.Arguments[1]);
                            Buffer.Append(")");
                            return;

                        case "Trim":
                            Buffer.Append("RTRIM(LTRIM(");
                            this.Visit(m.Object);
                            Buffer.Append("))");
                            return;
                        }
                    }
                }
                else
                {
                    if (m.Arguments.Any())
                    {
                        var argumentType = ReflectionHelper.RootTypeForExpression(m.Arguments[0]);
                        if (ReflectionHelper.HasInterface(m.Method.DeclaringType, typeof(System.Collections.IList)) && argumentType.Equals(this.Type))
                        {
                            evaluateCall = false;
                            switch (m.Method.Name)
                            {
                            case "Contains":
                                Visit(m.Arguments[0]);
                                Buffer.Append(" IN ");
                                ListToSet(Evaluate(Reduce(m.Object)) as System.Collections.IList);
                                break;
                            }
                        }
                    }
                }
            }

            if (evaluateCall)
            {
                var method = Expression.Call(Reduce(m.Object), m.Method, ReduceArgumentList(m.Arguments)); //rebuilds this into a new
                var result = Evaluate(method);

                var isDirectBooleanAccess = result is Boolean &&
                                            (parentNodeType == null || (parentNodeType != null && parentNodeType.Value != ExpressionType.Equal && parentNodeType.Value != ExpressionType.NotEqual));

                if (isDirectBooleanAccess)
                {
                    WriteLiteralValue(result);
                }
                else
                {
                    WriteParameter(Evaluate(method));
                }
            }
        }
Exemplo n.º 9
0
 internal static VBExpressionMetadata CreateMetadata(bool isInMultiline = false, ExpressionType?expressionType = null, bool returnBlock = false) => new VBExpressionMetadata
 {
     IsInMutiline   = isInMultiline,
     ExpressionType = expressionType,
     ReturnBkock    = returnBlock
 };
Exemplo n.º 10
0
        CRLExpression.CRLExpression MemberExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false)
        {
            #region MemberExpression
            //区分 属性表达带替换符{0} 变量值不带
            MemberExpression mExp = (MemberExpression)exp;
            if (mExp.Expression != null && mExp.Expression.NodeType == ExpressionType.Parameter) //like b.Name==b.Name1 或b.Name
            {
                #region MemberParameter
                var fieldName = mExp.Member.Name;
                var type      = mExp.Expression.Type;
                if (mExp.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType"))//按匿名类
                {
                    //var queryField = FormatFieldPrefix(type, fieldName);
                    var exp2 = new CRLExpression.CRLExpression()
                    {
                        Type = CRLExpression.CRLExpressionType.Name, Data = fieldName, MemberType = type
                    };
                    //MemberExpressionCache[key] = exp2;
                    return(exp2);
                }

                CRL.Attribute.FieldAttribute field;
                var a = TypeCache.GetProperties(type, true).TryGetValue(fieldName, out field);
                if (!a)
                {
                    throw new CRLException("类型 " + type.Name + "." + fieldName + " 未设置Mapping,请检查查询条件");
                }
                //if (!string.IsNullOrEmpty(field.VirtualField))//按虚拟字段
                //{
                //    //return filed.VirtualField;
                //    var queryField = field.VirtualField.Replace("{" + type.FullName + "}", Prefixs[type]);//替换前辍
                //    var exp2 = new CRLExpression.CRLExpression() { Type = CRLExpression.CRLExpressionType.Name, Data = queryField, MemberType = type };
                //    //MemberExpressionCache[key] = exp2;
                //    return exp2;
                //}
                //var fieldStr = FormatFieldPrefix(type, field.MapingName);//格式化为别名

                //return field;
                if (firstLevel)
                {
                    var exp2 = exp.Equal(Expression.Constant(true));
                    return(RouteExpressionHandler(exp2));
                }
                if (field.DefaultCRLExpression != null)
                {
                    var c2 = field.DefaultCRLExpression;
                    c2.Data = __DBAdapter.FieldNameFormat(field);
                    return(c2);
                }
                var fieldStr = __DBAdapter.FieldNameFormat(field);
                var exp3     = new CRLExpression.CRLExpression()
                {
                    Type = CRLExpression.CRLExpressionType.Name, Data = fieldStr, MemberType = type
                };
                field.DefaultCRLExpression = exp3;
                return(exp3);

                #endregion
            }
            else
            {
                //string key = mExp.ToString() + firstLevel;
                //CRLExpression.CRLExpression val;
                //var a1 = MemberExpressionCache.TryGetValue(key, out val);
                //if (a1)
                //{
                //    return val;
                //}
                #region  值
                bool isConstant;
                var  obj = GetParameExpressionValue(mExp, out isConstant);
                if (obj is Enum)
                {
                    obj = (int)obj;
                }
                else if (obj is Boolean)//sql2000需要转换
                {
                    obj = Convert.ToInt32(obj);
                }
                var exp4 = new CRLExpression.CRLExpression()
                {
                    Type = CRLExpression.CRLExpressionType.Value, Data = obj, IsConstantValue = isConstant
                };
                //if (isConstant)
                //{
                //    MemberExpressionCache[key] = exp4;
                //}
                return(exp4);

                #endregion
            }
            #endregion
        }
Exemplo n.º 11
0
        protected dynamic VisitMember(MemberExpression m, bool columnOnly)
        {
            if (m.Expression != null && m.Expression.NodeType == ExpressionType.Constant && (_overridedNodeType == null))
            {
                VisitConstantFixed(m.Expression as ConstantExpression, m.Member?.Name);
                return(m);
            }
            else if (m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter && (_overridedNodeType == null))
            {
                _overridedNodeType = null;
                var cl         = m.Expression.Type;
                var prop       = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).First(x => x.Name == m.Member.Name);
                var name       = prop.GetPropertyName();
                var table      = cl.GetCustomAttribute <Table>()?.Name ?? cl.Name;
                var columnName = string.Format("[{0}].[{1}]", table, name);
                if (columnOnly)
                {
                    return(columnName);
                }
                sb.Append(columnName);
                return(m);
            }
            else if (m.Expression != null && (m.Expression.NodeType == ExpressionType.MemberAccess))
            {
                _overridedNodeType = null;
                var key             = string.Join("", m.ToString().Split('.').Take(m.ToString().Split('.').Length - 1));
                var cl              = m.Expression.Type;
                var prop            = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).First(x => x.Name == m.Member.Name);
                var name            = prop.GetPropertyName();
                var table           = cl.GetCustomAttribute <Table>()?.Name ?? cl.Name;
                var randomTableName = JoinClauses.ContainsKey(key) ? JoinClauses[key].Item1 : RandomKey();
                var primaryId       = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).First(x => x.ContainAttribute <PrimaryKey>()).GetPropertyName();
                var columnName      = string.Format("[{0}].[{1}]", randomTableName, name);
                if (columnOnly)
                {
                    return(columnName);
                }
                sb.Append(columnName);
                if (JoinClauses.ContainsKey(key))
                {
                    return(m);
                }
                // Ok lets build inner join
                var parentType  = (m.Expression as MemberExpression).Expression.Type;
                var parentTable = parentType.GetCustomAttribute <Table>()?.Name ?? parentType.Name;
                prop = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(parentType).FirstOrDefault(x => x.ContainAttribute <ForeignKey>() && x.GetCustomAttribute <ForeignKey>().Type == cl);
                var v = "";
                if (prop != null)
                {
                    v += string.Format("LEFT JOIN [{0}] {1} ON [{2}].[{3}] = [{4}].[{5}]", table, randomTableName, randomTableName, primaryId, parentTable, prop.GetPropertyName());
                }
                else
                {
                    prop = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).FirstOrDefault(x => x.ContainAttribute <ForeignKey>() && x.GetCustomAttribute <ForeignKey>().Type == parentType);
                    if (prop != null)
                    {
                        v += string.Format("LEFT JOIN [{0}] {1} ON [{2}].[{3}] = [{4}].[{5}]", table, randomTableName, randomTableName, prop.GetPropertyName(), parentTable, primaryId);
                    }
                }

                JoinClauses.Add(key, new Tuple <string, string>(randomTableName, v));
                return(m);
            }
            else if (m.Expression != null && _overridedNodeType == ExpressionType.MemberAccess)
            {
                _overridedNodeType = null;
                var key             = string.Join("", m.ToString().Split('.').Take(m.ToString().Split('.').Length - 1));
                var cl              = m.Expression.Type;
                var prop            = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).First(x => x.Name == m.Member.Name);
                var table           = cl.GetCustomAttribute <Table>()?.Name ?? cl.Name;
                var randomTableName = JoinClauses.ContainsKey(key) ? JoinClauses[key].Item1 : RandomKey();
                var primaryId       = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(cl).First(x => x.ContainAttribute <PrimaryKey>()).GetPropertyName();
                if (JoinClauses.ContainsKey(key))
                {
                    return(m);
                }
                // Ok lets build inner join
                var parentType  = (m as MemberExpression).Type.GetActualType();
                var parentTable = parentType.GetCustomAttribute <Table>()?.Name ?? parentType.Name;
                prop = FastDeepCloner.DeepCloner.GetFastDeepClonerProperties(parentType).FirstOrDefault(x => x.ContainAttribute <ForeignKey>() && x.GetCustomAttribute <ForeignKey>().Type == cl);
                var v = "";
                if (prop != null)
                {
                    v += string.Format("INNER JOIN [{0}] {1} ON [{2}].[{3}] = [{4}].[{5}]", parentTable, randomTableName, table, primaryId, randomTableName, prop.GetPropertyName());
                }
                else
                {
                    throw new NotSupportedException(string.Format("CLASS STRUCTURE IS NOT SUPPORTED MEMBER{0}", m.Member.Name));
                }

                if (!string.IsNullOrEmpty(v))
                {
                    JoinClauses.Add(key, new Tuple <string, string>(randomTableName, v));
                }
                return(m);
            }

            throw new NotSupportedException(string.Format("The member '{0}' is not supported", m.Member.Name));
        }
Exemplo n.º 12
0
        static Expression ParseTillTerminator(ref TokenParser parser, string terminatorChars,
                                              bool throwOnTerminator,
                                              bool throwOnEnd,
                                              out char?token)
        {
            ExpressionOperatorGroup left = default;

            token = null;
            while (true)
            {
                if (parser.TryConsumeAny(terminatorChars.AsSpan(), out var consumedToken))
                {
                    if (throwOnTerminator || left.Empty)
                    {
                        throw new ExpressionParseException($"Unexpected '{token}'", parser.Position - 1);
                    }
                    token = consumedToken;
                    return(left.ToExpression());
                }
                parser.SkipWhitespace();
                if (parser.Length == 0)
                {
                    if (throwOnEnd || left.Empty)
                    {
                        throw new ExpressionParseException("Unexpected end of  expression", parser.Position);
                    }
                    return(left.ToExpression());
                }

                ExpressionType?op = null;
                if (left.NotEmpty)
                {
                    if (parser.TryConsume('?'))
                    {
                        var truePart = ParseTillTerminator(ref parser, ":",
                                                           false, true, out _);
                        // pass through the current parsing rules to consume the rest
                        var falsePart = ParseTillTerminator(ref parser, terminatorChars, throwOnTerminator, throwOnEnd,
                                                            out token);

                        return(new ConditionalExpression(left.ToExpression(), truePart, falsePart));
                    }

                    // We expect a binary operator here
                    if (!TryParseOperator(ref parser, out var sop))
                    {
                        throw new ExpressionParseException("Unexpected token", parser.Position);
                    }
                    op = sop;
                }

                // We expect an expression to be parsed (either due to expecting a binary operator or parsing the first part
                var applyNegation = false;
                while (parser.TryConsume('!'))
                {
                    applyNegation = !applyNegation;
                }

                var applyUnaryMinus = false;
                while (parser.TryConsume('-'))
                {
                    applyUnaryMinus = !applyUnaryMinus;
                }

                Expression?parsed;

                if (parser.TryConsume('('))
                {
                    parsed = ParseTillTerminator(ref parser, ")", false, true, out _);
                }
                else if (parser.TryParseCall(out var functionName))
                {
                    var parameterList = new List <Expression>();
                    while (true)
                    {
                        parameterList.Add(ParseTillTerminator(ref parser, ",)", false, true, out var closingToken));
                        if (closingToken == ')')
                        {
                            break;
                        }
                        if (closingToken != ',')
                        {
                            throw new ExpressionParseException("Unexpected end of the expression", parser.Position);
                        }
                    }

                    parsed = new FunctionCallExpression(functionName.ToString(), parameterList);
                }
                else if (TryParseAtomic(ref parser, out parsed))
                {
                    // do nothing
                }
                else
                {
                    throw new ExpressionParseException("Unexpected token", parser.Position);
                }


                // Parse any following member accesses
                while (parser.TryConsume('.'))
                {
                    if (!parser.TryParseIdentifier(out var memberName))
                    {
                        throw new ExpressionParseException("Unexpected token", parser.Position);
                    }

                    parsed = new MemberAccessExpression(parsed, memberName.ToString());
                }

                // Apply ! operator
                if (applyNegation)
                {
                    parsed = new UnaryExpression(parsed, ExpressionType.Not);
                }

                if (applyUnaryMinus)
                {
                    if (parsed is ConstantExpression constexpr)
                    {
                        parsed = new ConstantExpression(-constexpr.Constant);
                    }
                    else
                    {
                        parsed = new UnaryExpression(parsed, ExpressionType.UnaryMinus);
                    }
                }

                if (left.Empty)
                {
                    left.AppendFirst(parsed);
                }
                else
                {
                    left.AppendWithOperator(parsed, op !.Value);
                }
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// 根据ExpressionType格式化相应的符号类型
        /// </summary>
        /// <param name="nodeType"></param>
        /// <returns></returns>
        internal static string FormatBinaryOperator(ExpressionType?nodeType)
        {
            ExpressionType valueOrDefault = nodeType.GetValueOrDefault();

            if (nodeType.HasValue)
            {
                if (valueOrDefault <= ExpressionType.LessThanOrEqual)
                {
                    switch (valueOrDefault)
                    {
                    case ExpressionType.Add:
                    case ExpressionType.AddChecked:
                        return("+");

                    case ExpressionType.And:
                    case ExpressionType.AndAlso:
                        return("AND");

                    default:
                        switch (valueOrDefault)
                        {
                        case ExpressionType.Divide:
                            return(" / ");

                        case ExpressionType.Equal:
                            return(" = ");

                        case ExpressionType.GreaterThan:
                            return(" > ");

                        case ExpressionType.GreaterThanOrEqual:
                            return(" >= ");

                        case ExpressionType.LessThan:
                            return(" < ");

                        case ExpressionType.LessThanOrEqual:
                            return(" <= ");
                        }
                        break;
                    }
                }
                else
                {
                    switch (valueOrDefault)
                    {
                    case ExpressionType.Multiply:
                    case ExpressionType.MultiplyChecked:
                        return("*");

                    default:
                        switch (valueOrDefault)
                        {
                        case ExpressionType.NotEqual:
                            return("<>");

                        case ExpressionType.Or:
                        case ExpressionType.OrElse:
                            return("OR");

                        case ExpressionType.Subtract:
                        case ExpressionType.SubtractChecked:
                            return("-");

                        case ExpressionType.Modulo:
                            return("%");
                        }
                        break;
                    }
                }
            }
            return("" + nodeType);
        }
 public ExpressionTypeParseRule(ExpressionType?expressionType, Func <Texpression, bool> isApplicable, Func <Texpression, ExpressionParseEventArgs, string> parseFunction)
 {
     _expressionType = expressionType;
     _isApplicable   = isApplicable;
     _parseFunction  = parseFunction;
 }
Exemplo n.º 15
0
        protected override Expression VisitBinary(BinaryExpression node)
        {
            sb.Append("(");
            prev_op = node.NodeType;
            var tmp = invert;

            this.Visit(node.Left);

            switch (node.NodeType)
            {
            case ExpressionType.AndAlso:
                sb.Append(invert ? " OR " : " AND ");
                break;

            case ExpressionType.OrElse:
                sb.Append(invert ? " AND " : " OR ");
                break;

            case ExpressionType.Equal:
                if (IsNullConstant(node.Right))
                {
                    sb.Append(invert ? " IS NOT " : " IS ");
                }
                else
                {
                    if (boolean)
                    {
                        sb.Append(" = ");
                    }
                    else
                    {
                        sb.Append(invert ? " <> " : " = ");
                    }
                }
                break;

            case ExpressionType.NotEqual:
                if (IsNullConstant(node.Right))
                {
                    sb.Append(invert ? " IS " : " IS NOT ");
                }
                else
                {
                    if (boolean)
                    {
                        sb.Append(" = ");
                        invert = invert ^ true;
                    }
                    else
                    {
                        sb.Append(invert ? " = " : " != ");
                    }
                }
                break;

            case ExpressionType.LessThan:
                sb.Append(invert ? " >= " : " < ");
                break;

            case ExpressionType.LessThanOrEqual:
                sb.Append(invert ? " > " : " <= ");
                break;

            case ExpressionType.GreaterThan:
                sb.Append(invert ? " <= " : " > ");
                break;

            case ExpressionType.GreaterThanOrEqual:
                sb.Append(invert ? " < " : " >= ");
                break;

            default:
                throw new NotSupportedException(string.Format("The binary operator '{0}' is not supported", node.NodeType));
            }

            this.Visit(node.Right);
            invert = tmp;
            sb.Append(")");
            return(node);
        }
Exemplo n.º 16
0
 internal void Deconstruct(out bool isInMultiline, out ExpressionType?expressionType, out bool returnBlock)
 {
     isInMultiline  = IsInMutiline;
     expressionType = ExpressionType;
     returnBlock    = ReturnBkock;
 }
 public void SetInClause(IEnumerable values)
 {
     _operator = BinaryConditionItem.InOperator;
     _parameters.Add(values);
 }
Exemplo n.º 18
0
        protected Expression VisitBinary_Bak(BinaryExpression b)
        {
            this.Write("(");
            if (b.NodeType == ExpressionType.Power)
            {
                this.Write("POWER(");
                this.VisitValue(b.Left);
                this.Write(", ");
                this.VisitValue(b.Right);
                this.Write(")");
                //  return b;
            }
            else if (b.NodeType == ExpressionType.Coalesce)
            {
                this.Write("COALESCE(");
                this.VisitValue(b.Left);
                this.Write(", ");
                Expression right = b.Right;
                while (right.NodeType == ExpressionType.Coalesce)
                {
                    BinaryExpression rb = (BinaryExpression)right;
                    this.VisitValue(rb.Left);
                    this.Write(", ");
                    right = rb.Right;
                }
                this.VisitValue(right);
                this.Write(")");
                // return b;
            }
            else if (b.NodeType == ExpressionType.LeftShift)
            {
                this.Write("(");
                this.VisitValue(b.Left);
                this.Write(" * POWER(2, ");
                this.VisitValue(b.Right);
                this.Write("))");
                // return b;
            }
            else if (b.NodeType == ExpressionType.RightShift)
            {
                this.Write("(");
                this.VisitValue(b.Left);
                this.Write(" / POWER(2, ");
                this.VisitValue(b.Right);
                this.Write("))");
                //return b;
            }
            else
            {
                //if (b.Left is MemberExpression)
                //{
                //    if (((MemberExpression)b.Left).Type == typeof(bool) && (bizRead == BizExpSqlType.bizWhere))
                //    {
                //        this.Write("(" + ((MemberExpression)b.Left).Member.Name + " = 1)");
                //    }
                //    else
                //    {
                //        this.Visit(b.Left);
                //    }
                //}
                //else
                //{
                this.Visit(b.Left);
                //}

                this.Write(" ");
                this.Write(GetOperator(b.NodeType));
                m_binaryType = b.NodeType;
                this.Write(" ");
                this.Visit(b.Right);
            }
            this.Write(")");
            return(b);
        }