예제 #1
0
        CRLExpression BinaryExpressionHandler(Expression left, Expression right, ExpressionType type, int level = 1)
        {
            var types    = new ExpressionType[] { ExpressionType.Equal, ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual, ExpressionType.LessThan, ExpressionType.LessThanOrEqual, ExpressionType.NotEqual };
            var leftPar  = RouteExpressionHandler(left);
            var isBinary = types.Contains(type);
            var rightPar = RouteExpressionHandler(right);
            var e        = new CRLExpression()
            {
                ExpType = type, Left = leftPar, Right = rightPar, Type = isBinary ? CRLExpressionType.Binary : CRLExpressionType.Tree
            };

            return(e);
        }
예제 #2
0
        CRLExpression.CRLExpression BinaryExpressionHandler(Expression left, Expression right, ExpressionType type)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("(");
            var    leftPar = RouteExpressionHandler(left);
            string typeStr = ExpressionTypeCast(type);

            var rightPar = RouteExpressionHandler(right);

            #region 修正bool值一元运算
            //t1.isTop=1
            if (leftPar.Type == CRLExpression.CRLExpressionType.Binary && rightPar.Type == CRLExpression.CRLExpressionType.Name)
            {
                var proType = ((MemberExpression)right).Type;
                if (proType == typeof(bool))
                {
                    rightPar.Data = rightPar.Data + "=1";
                }
            }
            else if (rightPar.Type == CRLExpression.CRLExpressionType.Binary && leftPar.Type == CRLExpression.CRLExpressionType.Name)
            {
                var proType = ((MemberExpression)left).Type;
                if (proType == typeof(bool))
                {
                    leftPar.Data = leftPar.Data + "=1";
                }
            }
            #endregion
            string typeStr2;
            leftPar = DealParame(leftPar, typeStr, out typeStr2);
            sb.Append(leftPar.Data);
            rightPar = DealParame(rightPar, typeStr, out typeStr2);
            sb.Append(typeStr2);
            sb.Append(rightPar.Data);
            sb.Append(")");
            //return sb.ToString();
            var types    = new ExpressionType[] { ExpressionType.Equal, ExpressionType.GreaterThan, ExpressionType.GreaterThanOrEqual, ExpressionType.LessThan, ExpressionType.LessThanOrEqual, ExpressionType.NotEqual };
            var isBinary = types.Contains(type);
            var e        = new CRLExpression.CRLExpression()
            {
                ExpressionType = type.ToString(), Left = leftPar, Right = rightPar, Type = isBinary ? CRLExpression.CRLExpressionType.Binary : CRLExpression.CRLExpressionType.Tree
            };
            e.SqlOut = sb.ToString();
            e.Data   = e.SqlOut;
            return(e);
        }
예제 #3
0
        private static void Split(Expression expression, ICollection<Expression> list, ExpressionType[] binarySeparators)
        {
            if (expression != null)
            {
                if (binarySeparators.Contains(expression.NodeType))
                {
                    var binaryExpression = expression as BinaryExpression;

                    if (binaryExpression != null)
                    {
                        Split(binaryExpression.Left, list, binarySeparators);
                        Split(binaryExpression.Right, list, binarySeparators);
                    }
                }
                else
                {
                    list.Add(expression);
                }
            }
        }