internal override SqlSelect VisitSelect(SqlSelect select) { bool topSelect = this.topSelect; bool addPrimaryKeys = this.addPrimaryKeys; SqlSelect currentSelect = this.currentSelect; this.currentSelect = select; if (select.OrderingType == SqlOrderingType.Always) { this.addPrimaryKeys = true; } this.topSelect = false; if (select.GroupBy.Count > 0) { this.Visit(select.From); this.orders = null; } else { this.Visit(select.From); } if (select.OrderBy.Count > 0) { this.PrependOrderExpressions(select.OrderBy); } List <SqlOrderExpression> orders = this.orders; this.orders = null; this.rowNumberOrders = orders; select.Where = this.VisitExpression(select.Where); int num = 0; int count = select.GroupBy.Count; while (num < count) { select.GroupBy[num] = this.VisitExpression(select.GroupBy[num]); num++; } select.Having = this.VisitExpression(select.Having); int num3 = 0; int num4 = select.OrderBy.Count; while (num3 < num4) { select.OrderBy[num3].Expression = this.VisitExpression(select.OrderBy[num3].Expression); num3++; } select.Top = this.VisitExpression(select.Top); select.Selection = this.VisitExpression(select.Selection); select.Row = (SqlRow)this.Visit(select.Row); this.topSelect = topSelect; this.addPrimaryKeys = addPrimaryKeys; this.orders = orders; if (select.OrderingType == SqlOrderingType.Blocked) { this.orders = null; } select.OrderBy.Clear(); SqlRowNumberChecker checker = new SqlRowNumberChecker(); if (checker.HasRowNumber(select) && (checker.RowNumberColumn != null)) { select.Row.Columns.Remove(checker.RowNumberColumn); this.PushDown(checker.RowNumberColumn); this.Orders.Add(new SqlOrderExpression(SqlOrderType.Ascending, new SqlColumnRef(checker.RowNumberColumn))); } if ((this.topSelect || (select.Top != null)) && ((select.OrderingType != SqlOrderingType.Never) && (this.orders != null))) { SqlDuplicator duplicator = new SqlDuplicator(true); foreach (SqlOrderExpression expression in this.orders) { select.OrderBy.Add(new SqlOrderExpression(expression.OrderType, (SqlExpression) duplicator.Duplicate(expression.Expression))); } } this.currentSelect = currentSelect; return(select); }
internal override SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber) { if (rowNumber.OrderBy.Count <= 0) { SqlDuplicator duplicator = new SqlDuplicator(true); List <SqlOrderExpression> list = new List <SqlOrderExpression>(); List <SqlOrderExpression> list2 = new List <SqlOrderExpression>(); if ((this.rowNumberOrders != null) && (this.rowNumberOrders.Count != 0)) { list2 = new List <SqlOrderExpression>(this.rowNumberOrders); } else if (this.orders != null) { list2 = new List <SqlOrderExpression>(this.orders); } foreach (SqlOrderExpression expression in list2) { if (!expression.Expression.IsConstantColumn) { list.Add(expression); if (this.rowNumberOrders != null) { this.rowNumberOrders.Remove(expression); } if (this.orders != null) { this.orders.Remove(expression); } } } rowNumber.OrderBy.Clear(); if (list.Count == 0) { foreach ( SqlColumn column in SqlReorderer.SqlGatherColumnsProduced.GatherColumns(this.currentSelect.From)) { if (column.Expression.SqlType.IsOrderable) { list.Add(new SqlOrderExpression(SqlOrderType.Ascending, new SqlColumnRef(column))); } } if (list.Count == 0) { var column2 = new SqlColumn("rowNumberOrder", sql.Value(typeof(int), typeProvider.From(typeof(int)), 1, false, rowNumber.SourceExpression)); this.PushDown(column2); list.Add(new SqlOrderExpression(SqlOrderType.Ascending, new SqlColumnRef(column2))); } } foreach (SqlOrderExpression expression2 in list) { rowNumber.OrderBy.Add(new SqlOrderExpression(expression2.OrderType, (SqlExpression) duplicator.Duplicate(expression2.Expression))); } } return(rowNumber); }