public static SelectExpression RemoveOrderExpression(this SelectExpression select, OrderExpression ordering) { if (select.OrderBy != null && select.OrderBy.Count > 0) { List <OrderExpression> orderby = new List <OrderExpression>(select.OrderBy); orderby.Remove(ordering); return(select.SetOrderBy(orderby)); } return(select); }
public static SelectExpression AddOrderExpression(this SelectExpression select, OrderExpression ordering) { List <OrderExpression> orderby = new List <OrderExpression>(); if (select.OrderBy != null) { orderby.AddRange(select.OrderBy); } orderby.Add(ordering); return(select.SetOrderBy(orderby)); }
protected override Expression VisitSelect(SelectExpression select) { // select * from table order by x skip s take t // => // select * from (select top s * from (select top s + t from table order by x) order by -x) order by x select = (SelectExpression)base.VisitSelect(select); if (select.Skip != null && select.Take != null && select.OrderBy.Count > 0) { var skip = select.Skip; var take = select.Take; var skipPlusTake = PartialEvaluator.Eval(Expression.Add(skip, take)); select = select.SetTake(skipPlusTake).SetSkip(null); select = select.AddRedundantSelect(this.language, new TableAlias()); select = select.SetTake(take); // propogate order-bys to new layer select = (SelectExpression)OrderByRewriter.Rewrite(this.language, select); var inverted = select.OrderBy.Select(ob => new OrderExpression( ob.OrderType == OrderType.Ascending ? OrderType.Descending : OrderType.Ascending, ob.Expression )); select = select.SetOrderBy(inverted); select = select.AddRedundantSelect(this.language, new TableAlias()); select = select.SetTake(Expression.Constant(0)); // temporary select = (SelectExpression)OrderByRewriter.Rewrite(this.language, select); var reverted = select.OrderBy.Select(ob => new OrderExpression( ob.OrderType == OrderType.Ascending ? OrderType.Descending : OrderType.Ascending, ob.Expression )); select = select.SetOrderBy(reverted); select = select.SetTake(null); } return(select); }