internal override SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber)
		{
			List<SqlOrderExpression> orderBy = new List<SqlOrderExpression>();

			foreach(SqlOrderExpression expr in rowNumber.OrderBy)
			{
				orderBy.Add(new SqlOrderExpression(expr.OrderType, (SqlExpression)this.Visit(expr.Expression)));
			}

			return new SqlRowNumber(rowNumber.ClrType, rowNumber.SqlType, orderBy, rowNumber.SourceExpression);
		}
			internal override SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber)
			{
				this.hasRowNumber = true;
				return rowNumber;
			}
Example #3
0
 internal virtual SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber) {
     for (int i = 0, n = rowNumber.OrderBy.Count; i < n; i++) {
         rowNumber.OrderBy[i].Expression = this.VisitExpression(rowNumber.OrderBy[i].Expression);
     } 
     
     return rowNumber;
 }
Example #4
0
		internal override SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber)
		{
			if(rowNumber.OrderBy.Count > 0) return rowNumber;

			SqlDuplicator dup = new SqlDuplicator(true);
			List<SqlOrderExpression> orderBy = new List<SqlOrderExpression>();
			List<SqlOrderExpression> existingOrders = new List<SqlOrderExpression>();

			if(this.rowNumberOrders != null && this.rowNumberOrders.Count != 0)
			{
				existingOrders = new List<SqlOrderExpression>(this.rowNumberOrders);
			}
			else if(this.orders != null)
			{
				existingOrders = new List<SqlOrderExpression>(this.orders);
			}

			foreach(SqlOrderExpression expr in existingOrders)
			{
				if(!expr.Expression.IsConstantColumn)
				{
					orderBy.Add(expr);
					if(this.rowNumberOrders != null)
					{
						this.rowNumberOrders.Remove(expr);
					}
					if(this.orders != null)
					{
						this.orders.Remove(expr);
					}
				}
			}

			rowNumber.OrderBy.Clear();

			if(orderBy.Count == 0)
			{
				List<SqlColumn> columns = SqlGatherColumnsProduced.GatherColumns(this.currentSelect.From);

				foreach(SqlColumn col in columns)
				{
					if(col.Expression.SqlType.IsOrderable)
					{
						orderBy.Add(new SqlOrderExpression(SqlOrderType.Ascending, new SqlColumnRef(col)));
					}
				}

				if(orderBy.Count == 0)
				{
					// insert simple column
					SqlColumn col =
						new SqlColumn(
							"rowNumberOrder",
							sql.Value(typeof(int), this.typeProvider.From(typeof(int)), 1, false, rowNumber.SourceExpression)
							);
					this.PushDown(col);
					orderBy.Add(new SqlOrderExpression(SqlOrderType.Ascending, new SqlColumnRef(col)));
				}
			}

			foreach(SqlOrderExpression sox in orderBy)
			{
				rowNumber.OrderBy.Add(new SqlOrderExpression(sox.OrderType, (SqlExpression)dup.Duplicate(sox.Expression)));
			}

			return rowNumber;
		}
		internal override SqlRowNumber VisitRowNumber(SqlRowNumber rowNumber)
		{
			_commandStringBuilder.Append("ROW_NUMBER() OVER (ORDER BY ");

			for(int i = 0, n = rowNumber.OrderBy.Count; i < n; i++)
			{
				SqlOrderExpression exp = rowNumber.OrderBy[i];

				if(i > 0) _commandStringBuilder.Append(", ");

				this.Visit(exp.Expression);

				if(exp.OrderType == SqlOrderType.Descending)
				{
					_commandStringBuilder.Append(" DESC");
				}
			}

			_commandStringBuilder.Append(")");

			return rowNumber;
		}