示例#1
0
        protected virtual Expression VisitBetween(DbBetweenExpression between)
        {
            Expression expr  = Visit(between.Expression);
            Expression lower = Visit(between.Lower);
            Expression upper = Visit(between.Upper);

            return(UpdateBetween(between, expr, lower, upper));
        }
示例#2
0
        protected DbBetweenExpression UpdateBetween(DbBetweenExpression between,
                                                    Expression expression, Expression lower, Expression upper)
        {
            if (expression != between.Expression ||
                lower != between.Lower || upper != between.Upper)
            {
                return(new DbBetweenExpression(expression, lower, upper));
            }

            return(between);
        }
        protected override Expression VisitSelect(DbSelectExpression select)
        {
            select = (DbSelectExpression)base.VisitSelect(select);
            if (select.Skip != null)
            {
                DbSelectExpression newSelect = select.SetSkip(null).SetTake(null);
                bool canAddColumn = !select.IsDistinct && (select.GroupBy == null || select.GroupBy.Count == 0);
                if (!canAddColumn)
                {
                    newSelect = newSelect.AddRedundantSelect(new DbTableAlias());
                }
                newSelect = newSelect.AddColumn(new DbColumnDeclaration("rownum", new DbRowNumberExpression(select.OrderBy)));

                // add layer for WHERE clause that references new rownum column
                newSelect = newSelect.AddRedundantSelect(new DbTableAlias());
                newSelect = newSelect.RemoveColumn(newSelect.Columns.Single(c => c.Name == "rownum"));

                var newAlias = ((DbSelectExpression)newSelect.From).Alias;
                DbColumnExpression rnCol = new DbColumnExpression(typeof(int), null, newAlias, "rownum");
                Expression where;
                if (select.Take != null)
                {
                    where = new DbBetweenExpression(rnCol, Expression.Add(select.Skip, Expression.Constant(1)), 
                        Expression.Add(select.Skip, select.Take));
                }
                else
                {
                    where = rnCol.GreaterThan(select.Skip);
                }
                if (newSelect.Where != null)
                {
                    where = newSelect.Where.And(where);
                }
                newSelect = newSelect.SetWhere(where);

                select = newSelect;
            }
            return select;
        }
示例#4
0
        protected override Expression VisitSelect(DbSelectExpression select)
        {
            select = (DbSelectExpression)base.VisitSelect(select);
            if (select.Skip != null)
            {
                DbSelectExpression newSelect = select.SetSkip(null).SetTake(null);
                bool canAddColumn            = !select.IsDistinct && (select.GroupBy == null || select.GroupBy.Count == 0);
                if (!canAddColumn)
                {
                    newSelect = newSelect.AddRedundantSelect(new DbTableAlias());
                }
                newSelect = newSelect.AddColumn(new DbColumnDeclaration("rownum", new DbRowNumberExpression(select.OrderBy)));

                // add layer for WHERE clause that references new rownum column
                newSelect = newSelect.AddRedundantSelect(new DbTableAlias());
                newSelect = newSelect.RemoveColumn(newSelect.Columns.Single(c => c.Name == "rownum"));

                var newAlias             = ((DbSelectExpression)newSelect.From).Alias;
                DbColumnExpression rnCol = new DbColumnExpression(typeof(int), null, newAlias, "rownum");
                Expression where;
                if (select.Take != null)
                {
                    where = new DbBetweenExpression(rnCol, Expression.Add(select.Skip, Expression.Constant(1)),
                                                    Expression.Add(select.Skip, select.Take));
                }
                else
                {
                    where = rnCol.GreaterThan(select.Skip);
                }
                if (newSelect.Where != null)
                {
                    where = newSelect.Where.And(where);
                }
                newSelect = newSelect.SetWhere(where);

                select = newSelect;
            }
            return(select);
        }
 protected DbBetweenExpression UpdateBetween(DbBetweenExpression between, 
     Expression expression, Expression lower, Expression upper)
 {
     if (expression != between.Expression || 
         lower != between.Lower || upper != between.Upper)
         return new DbBetweenExpression(expression, lower, upper);
     
     return between;
 }
        protected virtual Expression VisitBetween(DbBetweenExpression between)
        {
            Expression expr = Visit(between.Expression);
            Expression lower = Visit(between.Lower);
            Expression upper = Visit(between.Upper);

            return UpdateBetween(between, expr, lower, upper);
        }
 protected virtual bool CompareBetween(DbBetweenExpression a, DbBetweenExpression b)
 {
     return(Compare(a.Expression, b.Expression) &&
            Compare(a.Lower, b.Lower) &&
            Compare(a.Upper, b.Upper));
 }
 protected override Expression VisitBetween(DbBetweenExpression between)
 {
     this.VisitValue(between.Expression);
     this.Write(" BETWEEN ");
     this.VisitValue(between.Lower);
     this.Write(" AND ");
     this.VisitValue(between.Upper);
     return between;
 }
 protected virtual bool CompareBetween(DbBetweenExpression a, DbBetweenExpression b)
 {
     return Compare(a.Expression, b.Expression)
         && Compare(a.Lower, b.Lower)
         && Compare(a.Upper, b.Upper);
 }