Represents a boolean data type in SQL which is 1 or 0.
SqlServerBooleanNormalizer automatically adds comparisons to convert BitBooleans values into logical true/false when needed for joins, where conditions, etc
Inheritance: Shaolinq.Persistence.Linq.Expressions.SqlBaseExpression
        protected override Expression VisitConditional(ConditionalExpression expression)
        {
            var test    = this.Visit(expression.Test);
            var ifFalse = this.Visit(expression.IfFalse);
            var ifTrue  = this.Visit(expression.IfTrue);

            if (test is BitBooleanExpression)
            {
                test = Expression.Equal(test, Expression.Constant(true, test.Type));
            }

            if (ifFalse.Type.GetUnwrappedNullableType() == typeof(bool) && !(ifFalse is BitBooleanExpression))
            {
                ifFalse = BitBooleanExpression.Coerce(ifFalse);
            }

            if (ifTrue.Type.GetUnwrappedNullableType() == typeof(bool) && !(ifTrue is BitBooleanExpression))
            {
                ifTrue = BitBooleanExpression.Coerce(ifTrue);
            }

            if (test != expression.Test || ifFalse != expression.IfFalse || ifTrue != expression.IfTrue)
            {
                return(new BitBooleanExpression(Expression.Condition(test, ifTrue, ifFalse)));
            }
            else
            {
                return(base.VisitConditional(expression));
            }
        }
        protected override Expression VisitSelect(SqlSelectExpression selectExpression)
        {
            var count = selectExpression.Columns.Count;
            List <SqlColumnDeclaration> newColumns = null;

            for (var i = 0; i < count; i++)
            {
                var column = selectExpression.Columns[i];
                var visitedColumnExpression = this.Visit(column.Expression);

                if (visitedColumnExpression.Type.GetUnwrappedNullableType() == typeof(bool) && !(visitedColumnExpression is BitBooleanExpression))
                {
                    if (newColumns == null)
                    {
                        newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i));
                    }

                    var newColumnExpression  = BitBooleanExpression.Coerce(visitedColumnExpression);
                    var newColumnDeclaration = new SqlColumnDeclaration(column.Name, newColumnExpression);

                    newColumns.Add(newColumnDeclaration);
                }
                else if (visitedColumnExpression != column.Expression)
                {
                    if (newColumns == null)
                    {
                        newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i));
                    }

                    newColumns.Add(column.ReplaceExpression(visitedColumnExpression));
                }
                else if (newColumns != null)
                {
                    newColumns.Add(column);
                }
            }

            var from = this.VisitSource(selectExpression.From);

            var where = this.Visit(selectExpression.Where);
            var orderBy = this.VisitExpressionList(selectExpression.OrderBy);
            var groupBy = this.VisitExpressionList(selectExpression.GroupBy);
            var skip    = this.Visit(selectExpression.Skip);
            var take    = this.Visit(selectExpression.Take);

            if (where is BitBooleanExpression)
            {
                where = Expression.Equal(where, Expression.Constant(true, where.Type));
            }

            if (from != selectExpression.From || where != selectExpression.Where || newColumns != selectExpression.Columns || orderBy != selectExpression.OrderBy || groupBy != selectExpression.GroupBy || take != selectExpression.Take || skip != selectExpression.Skip)
            {
                return(new SqlSelectExpression(selectExpression.Type, selectExpression.Alias, newColumns ?? selectExpression.Columns, from, where, orderBy, groupBy, selectExpression.Distinct, skip, take, selectExpression.ForUpdate, selectExpression.Reverse, selectExpression.Into));
            }

            return(base.VisitSelect(selectExpression));
        }
Exemple #3
0
        public static BitBooleanExpression Coerce(Expression expression)
        {
            var nullable = expression.Type == typeof(bool?);

            var retval = new BitBooleanExpression(Condition(expression, new BitBooleanExpression(Constant(true, nullable ? typeof(bool?) : typeof(bool))), new BitBooleanExpression(Constant(false, nullable ? typeof(bool?) : typeof(bool)))));

            if (nullable)
            {
                retval = new BitBooleanExpression(Condition(Equal(retval, Constant(null)), Constant(null, typeof(bool?)), retval));
            }

            return(retval);
        }
        public static BitBooleanExpression Coerce(Expression expression)
        {
            var nullable = expression.Type == typeof(bool?);

            var retval = new BitBooleanExpression(Condition(expression, new BitBooleanExpression(Constant(true, nullable ? typeof(bool?) : typeof(bool))), new BitBooleanExpression(Constant(false, nullable ? typeof(bool?) : typeof(bool)))));

            if (nullable)
            {
                retval = new BitBooleanExpression(Condition(Equal(retval, Constant(null)), Constant(null, typeof(bool?)), retval));
            }

            return retval;
        }
Exemple #5
0
        protected override Expression VisitSelect(SqlSelectExpression selectExpression)
        {
            List <SqlColumnDeclaration> newColumns = null;

            for (var i = 0; i < selectExpression.Columns.Count; i++)
            {
                var column = selectExpression.Columns[i];
                var visitedColumnExpression = this.Visit(column.Expression);

                if (visitedColumnExpression.Type.GetUnwrappedNullableType() == typeof(bool) && !(visitedColumnExpression is BitBooleanExpression))
                {
                    if (newColumns == null)
                    {
                        newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i));
                    }

                    var newColumnExpression  = BitBooleanExpression.Coerce(visitedColumnExpression);
                    var newColumnDeclaration = new SqlColumnDeclaration(column.Name, newColumnExpression);

                    newColumns.Add(newColumnDeclaration);
                }
                else if (visitedColumnExpression != column.Expression)
                {
                    if (newColumns == null)
                    {
                        newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i));
                    }

                    newColumns.Add(column.ReplaceExpression(visitedColumnExpression));
                }
                else if (newColumns != null)
                {
                    newColumns.Add(column);
                }
            }

            var where = this.Visit(selectExpression.Where);

            if ((where is BitBooleanExpression))
            {
                where = Expression.Equal(where, Expression.Constant(true));
            }

            if (where != selectExpression.Where)
            {
                if (newColumns != null)
                {
                    return(selectExpression.ChangeWhereAndColumns(where, new ReadOnlyList <SqlColumnDeclaration>(newColumns)));
                }
                else
                {
                    return(selectExpression.ChangeWhere(where));
                }
            }
            else if (newColumns != null)
            {
                return(selectExpression.ChangeColumns(newColumns, true));
            }
            else
            {
                return(base.VisitSelect(selectExpression));
            }
        }