protected virtual Expression VisitBetween(DbBetweenExpression between)
        {
            var expr  = this.Visit(between.Expression);
            var lower = this.Visit(between.Lower);
            var upper = this.Visit(between.Upper);

            return(this.UpdateBetween(between, expr, lower, upper));
        }
 protected virtual bool CompareBetween(DbBetweenExpression a, DbBetweenExpression b)
 {
     return
         (
         this.Compare(a.Expression, b.Expression) &&
         this.Compare(a.Lower, b.Lower) &&
         this.Compare(a.Upper, b.Upper)
         );
 }
        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);
        }
Beispiel #4
0
        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 override Expression VisitSelect(DbSelectExpression select)
        {
            select = base.VisitSelect(select) as DbSelectExpression;

            if (select.Skip != null)
            {
                var newSelect    = select.SetSkip(null).SetTake(null);
                var canAddColumn = !select.IsDistinct && (select.GroupBy == null || select.GroupBy.Count == 0);

                if (canAddColumn == false)
                {
                    newSelect = newSelect.AddRedundantSelect(this.language, new TableAlias());
                }

                var colType = this.language.TypeSystem.GetColumnType(typeof(int));

                newSelect = newSelect.AddColumn(new DbColumnDeclaration("_rownum", new DbRowNumberExpression(select.OrderBy), colType));

                newSelect = newSelect.AddRedundantSelect(this.language, new TableAlias());
                newSelect = newSelect.RemoveColumn(newSelect.Columns.Single(c => c.Name == "_rownum"));

                var newAlias = (newSelect.From as DbSelectExpression).Alias;
                var rnCol    = new DbColumnExpression(typeof(int), colType, newAlias, "_rownum");
                var where = null as Expression;

                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);
        }