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