protected override Expression VisitSelect(SelectExpression select) { select = (SelectExpression)base.VisitSelect(select); if (select.Skip != null) { Expression expression3; SelectExpression sel = select.SetSkip(null).SetTake(null); if (select.IsDistinct || ((select.GroupBy != null) && (select.GroupBy.Count != 0))) { sel = sel.AddRedundantSelect(this.language, new TableAlias()); } QueryType columnType = this.language.TypeSystem.GetColumnType(typeof(int)); sel = sel.AddColumn(new ColumnDeclaration("row__num", new RowNumberExpression(select.OrderBy), columnType)).AddRedundantSelect(this.language, new TableAlias()); sel = sel.RemoveColumn(sel.Columns.Single <ColumnDeclaration>(c => c.Name == "row__num")); TableAlias alias = ((SelectExpression)sel.From).Alias; ColumnExpression expression = new ColumnExpression(typeof(int), columnType, alias, "row__num"); if (select.Take != null) { expression3 = new BetweenExpression(expression, Expression.Add(select.Skip, Expression.Constant(1)), Expression.Add(select.Skip, select.Take)); } else { expression3 = expression.GreaterThan(select.Skip); } if (sel.Where != null) { expression3 = sel.Where.And(expression3); } select = sel.SetWhere(expression3); } return(select); }
protected override Expression VisitSelect(SelectExpression selectExpression) { selectExpression = (SelectExpression)base.VisitSelect(selectExpression); if (((selectExpression.Skip != null) && (selectExpression.Take != null)) && (selectExpression.OrderBy.Count > 0)) { Expression skip = selectExpression.Skip; Expression take = selectExpression.Take; Expression expression3 = PartialEvaluator.Eval(Expression.Add(skip, take)); selectExpression = selectExpression.SetTake(expression3).SetSkip(null); selectExpression = selectExpression.AddRedundantSelect(this.language, new TableAlias()); selectExpression = selectExpression.SetTake(take); selectExpression = (SelectExpression)OrderByRewriter.Rewrite(this.language, selectExpression); IEnumerable <OrderExpression> orderBy = from ob in selectExpression.OrderBy select new OrderExpression((ob.OrderType == OrderType.Ascending) ? OrderType.Descending : OrderType.Ascending, ob.Expression); selectExpression = selectExpression.SetOrderBy(orderBy); selectExpression = selectExpression.AddRedundantSelect(this.language, new TableAlias()); selectExpression = selectExpression.SetTake(Expression.Constant(0)); selectExpression = (SelectExpression)OrderByRewriter.Rewrite(this.language, selectExpression); IEnumerable <OrderExpression> enumerable2 = from ob in selectExpression.OrderBy select new OrderExpression((ob.OrderType == OrderType.Ascending) ? OrderType.Descending : OrderType.Ascending, ob.Expression); selectExpression = selectExpression.SetOrderBy(enumerable2); selectExpression = selectExpression.SetTake(null); } return(selectExpression); }