Example #1
0
        private Expression VisitStrMethodCall_ToString(MethodCallExpression m, ExpressionVisitorBase visitor)
        {
            visitor.Append("CAST(");
            visitor.Visit(m.Object != null ? m.Object : m.Arguments[0]);
            visitor.Append(" AS VARCHAR)");

            return(m);
        }
Example #2
0
        private Expression VisitStrMember_Length(MemberExpression m, ExpressionVisitorBase visitor)
        {
            visitor.Append("LEN(");
            visitor.Visit(m.Expression);
            visitor.Append(")");

            return(m);
        }
Example #3
0
        private Expression VisitStrMethodCall_Trim(MethodCallExpression m, ExpressionVisitorBase visitor)
        {
            if (m != null)
            {
                visitor.Append("RTRIM(LTRIM(");
                visitor.Visit(m.Object != null ? m.Object : m.Arguments[0]);
                visitor.Append("))");
            }

            return(m);
        }
Example #4
0
        /// <summary>
        /// 访问表示 null 合并运算的节点 a ?? b
        /// </summary>
        /// <param name="b">二元表达式节点</param>
        /// <param name="visitor">访问器</param>
        /// <returns></returns>
        public override Expression VisitCoalesce(BinaryExpression b, ExpressionVisitorBase visitor)
        {
            // expression like a.Name ?? "TAN" => ISNULL(a.Name,'TAN')

            visitor.Append("ISNULL(");
            visitor.Visit(b.Left is ConstantExpression ? b.Right : b.Left);
            visitor.Append(",");
            visitor.Visit(b.Left is ConstantExpression ? b.Left : b.Right);
            visitor.Append(")");


            return(b);
        }
Example #5
0
        private Expression VisitEnumMethodCall_Contains(MethodCallExpression m, ExpressionVisitorBase visitor)
        {
            if (m == null)
            {
                return(m);
            }

            MemberExpression member = m.Arguments[m.Arguments.Count - 1] as MemberExpression;

            visitor.Visit(m.Arguments[m.Arguments.Count - 1]);
            visitor.Append(" IN(");

            //ConstantExpression constExpr = (m.Object != null ? m.Object : m.Arguments[0]) as ConstantExpression;
            //visitor.Visit(constExpr);
            Expression exp = m.Object != null ? m.Object : m.Arguments[0];

            if (exp.NodeType == ExpressionType.Constant)
            {
                visitor.Visit(exp);
            }
            else if (exp.NodeType == ExpressionType.MemberAccess)
            {
                visitor.Visit(exp.Evaluate());
            }
            else if (exp.NodeType == ExpressionType.NewArrayInit)
            {
                var expressions = (exp as NewArrayExpression).Expressions;
                for (int i = 0; i < expressions.Count; i++)
                {
                    visitor.Visit(expressions[i]);
                    if (i < expressions.Count - 1)
                    {
                        visitor.Append(",");
                    }
                }
            }

            visitor.Append(")");


            return(m);
        }
Example #6
0
        private Expression VisitStrMethodCall_SubString(MethodCallExpression m, ExpressionVisitorBase visitor)
        {
            if (m != null)
            {
                List <Expression> args = new List <Expression>(m.Arguments);
                if (m.Object != null)
                {
                    args.Insert(0, m.Object);
                }

                visitor.Append("SUBSTRING(");
                visitor.Visit(args[0]);
                visitor.Append(",");
                visitor.Visit(args[1]);
                visitor.Append(" + 1,");

                if (args.Count == 3)
                {
                    visitor.Visit(args[2]);
                }
                else
                {
                    visitor.Append("LEN(");
                    visitor.Visit(args[0]);
                    visitor.Append(")");
                }
                visitor.Append(")");
            }

            return(m);
        }
Example #7
0
        /// <summary>
        /// 访问表示 null 判断运算的节点 a.Name == null
        /// </summary>
        /// <param name="b">二元表达式节点</param>
        /// <param name="ExpressionVisitorBase">访问器</param>
        /// <returns></returns>
        public override Expression VisitEqualNull(BinaryExpression b, ExpressionVisitorBase visitor)
        {
            // a.Name == null => a.Name Is Null

            string oper = b.NodeType == ExpressionType.Equal
                ? " IS "
                : " IS NOT ";

            visitor.Visit(b.Left is ConstantExpression ? b.Right : b.Left);
            visitor.Append(oper);
            visitor.Visit(b.Left is ConstantExpression ? b.Left : b.Right);

            return(b);
        }
Example #8
0
        private Expression VisitStrMethodCall_EndsWith(MethodCallExpression m, ExpressionVisitorBase visitor)
        {
            if (m != null)
            {
                visitor.Visit(m.Object);
                visitor.Append(" LIKE ");
                if (m.Arguments[0].NodeType == ExpressionType.Constant)
                {
                    ConstantExpression c = m.Arguments[0] as ConstantExpression;
                    //visitor.Append(string.Format("N'%{0}'", c.Value));
                    visitor.Append("N'%");
                    visitor.Append(c.Value != null ? c.Value.ToString() : string.Empty);
                    visitor.Append("'");
                }
                else
                {
                    visitor.Append("('%' + ");
                    visitor.Visit(m.Arguments[0]);
                    visitor.Append(")");
                }
            }

            return(m);
        }