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