Exemplo n.º 1
0
 public string GetSql(Expression expr)
 {
     Result.Clear();
     if (expr.Type == typeof(bool) && expr.NodeType == ExpressionType.MemberAccess)
     {
         expr = ExpressionsHelper.GetBinaryExpression(expr);
     }
     Visit(expr);
     return(Result.ToString());
 }
Exemplo n.º 2
0
        public virtual IResult Resolve <TEntity>(Expression expression) where TEntity : class
        {
            EntityMetadata = EntityMetadata.Parse <TEntity>();
            Result         = new DbResolveResult();

            if (expression.Type == typeof(bool) && expression.NodeType == ExpressionType.MemberAccess)
            {
                expression = ExpressionsHelper.GetBinaryExpression(expression);
            }

            Visit(expression);

            return(Result);
        }
Exemplo n.º 3
0
        protected override Expression VisitBinary(BinaryExpression b)
        {
            var left          = b.Left;
            var right         = b.Right;
            var boolOperators = new[] { ExpressionType.AndAlso, ExpressionType.OrElse };

            if (boolOperators.Contains(b.NodeType))
            {
                left  = left.NodeType == ExpressionType.MemberAccess ? ExpressionsHelper.GetBinaryExpression(left) : left;
                right = right.NodeType == ExpressionType.MemberAccess ? ExpressionsHelper.GetBinaryExpression(right) : right;
            }

            var dialect = Configuration.Dialect;

            Result.Append(dialect.Symbol(SqlSymbols.StartGroup));
            this.Visit(left);

            switch (b.NodeType)
            {
            case ExpressionType.And:
                Result.Append($" {dialect.Keyword(SqlKeyword.And)} ");
                break;

            case ExpressionType.AndAlso:
                Result.Append($" {dialect.Keyword(SqlKeyword.And)} ");
                break;

            case ExpressionType.Or:
                Result.Append($" {dialect.Keyword(SqlKeyword.Or)} ");
                break;

            case ExpressionType.OrElse:
                Result.Append($" {dialect.Keyword(SqlKeyword.Or)} ");
                break;

            case ExpressionType.Equal:
                if (IsNullConstant(b.Right))
                {
                    Result.Append($" {dialect.ComparisonSymbol(SqlComparison.Is)} ");
                }
                else
                {
                    Result.Append($" {dialect.ComparisonSymbol(SqlComparison.Equal)} ");
                }
                break;

            case ExpressionType.NotEqual:
                if (IsNullConstant(b.Right))
                {
                    Result.Append($" {dialect.ComparisonSymbol(SqlComparison.IsNot)} ");
                }
                else
                {
                    Result.Append($" {dialect.ComparisonSymbol(SqlComparison.NotEqual)} ");
                }
                break;

            case ExpressionType.LessThan:
                Result.Append($" {dialect.ComparisonSymbol(SqlComparison.LessThan)} ");
                break;

            case ExpressionType.LessThanOrEqual:
                Result.Append($" {dialect.ComparisonSymbol(SqlComparison.LessThanOrEqual)} ");
                break;

            case ExpressionType.GreaterThan:
                Result.Append($" {dialect.ComparisonSymbol(SqlComparison.GreaterThan)} ");
                break;

            case ExpressionType.GreaterThanOrEqual:
                Result.Append($" {dialect.ComparisonSymbol(SqlComparison.GreaterThanOrEqual)} ");
                break;

            case ExpressionType.Add:
                Result.Append($" {dialect.ArithMeticOperand(SqlArithmeticOperand.Add)} ");
                break;

            case ExpressionType.Subtract:
                Result.Append($" {dialect.ArithMeticOperand(SqlArithmeticOperand.Subtract)} ");
                break;

            case ExpressionType.Multiply:
                Result.Append($" {dialect.ArithMeticOperand(SqlArithmeticOperand.Multiply)} ");
                break;

            case ExpressionType.Divide:
                Result.Append($" {dialect.ArithMeticOperand(SqlArithmeticOperand.Divide)} ");
                break;

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

            this.Visit(right);
            Result.Append(dialect.Symbol(SqlSymbols.EndGroup));
            return(b);
        }
Exemplo n.º 4
0
        protected override Expression VisitBinary(BinaryExpression b)
        {
            var left          = b.Left;
            var right         = b.Right;
            var boolOperators = new[] { ExpressionType.AndAlso, ExpressionType.OrElse };

            if (boolOperators.Contains(b.NodeType))
            {
                left  = left.NodeType == ExpressionType.MemberAccess ? ExpressionsHelper.GetBinaryExpression(left) : left;
                right = right.NodeType == ExpressionType.MemberAccess ? ExpressionsHelper.GetBinaryExpression(right) : right;
            }

            var builder = (Result as DbResolveResult).Builder;

            builder.Append(Dialect.StartGroup);
            this.Visit(left);

            switch (b.NodeType)
            {
            case ExpressionType.And:
                builder.Append($" {Dialect.And} ");
                break;

            case ExpressionType.AndAlso:
                builder.Append($" {Dialect.And} ");
                break;

            case ExpressionType.Or:
                builder.Append($" {Dialect.Or} ");
                break;

            case ExpressionType.OrElse:
                builder.Append($" {Dialect.Or} ");
                break;

            case ExpressionType.Equal:
                if (ExpressionsHelper.IsNullConstant(b.Right))
                {
                    builder.Append($" {Dialect.Is} ");
                }
                else
                {
                    builder.Append($" {Dialect.Equal} ");
                }
                break;

            case ExpressionType.NotEqual:
                if (ExpressionsHelper.IsNullConstant(b.Right))
                {
                    builder.Append($" {Dialect.IsNot} ");
                }
                else
                {
                    builder.Append($" {Dialect.NotEqual} ");
                }
                break;

            case ExpressionType.LessThan:
                builder.Append($" {Dialect.LessThan} ");
                break;

            case ExpressionType.LessThanOrEqual:
                builder.Append($" {Dialect.LessThanOrEqual} ");
                break;

            case ExpressionType.GreaterThan:
                builder.Append($" {Dialect.GreaterThan} ");
                break;

            case ExpressionType.GreaterThanOrEqual:
                builder.Append($" {Dialect.GreaterThanOrEqual} ");
                break;

            default:
                throw new NotSupportedException($"The binary operator '{b.NodeType}' is not supported");
            }

            this.Visit(right);
            builder.Append(Dialect.EndGroup);
            return(b);
        }