private static IList<SortColumn> ResolveOrderByRefs(PreparedQuerySelectColumns columnSet,
IEnumerable<SortColumn> orderBy)
{
// Resolve any numerical references in the ORDER BY list (eg.
// '1' will be a reference to column 1.
if (orderBy == null)
return null;
var columnCount = columnSet.SelectedColumns.Count();
var resolvedColumns = new List<SortColumn>();
foreach (var column in orderBy) {
var resolved = column;
var expression = column.Expression;
if (expression.ExpressionType == SqlExpressionType.Constant) {
var value = ((SqlConstantExpression) expression).Value;
if (value.Type is NumericType &&
!value.IsNull) {
var colRef = ((SqlNumber) value.Value).ToInt32() - 1;
if (colRef >= 0 && colRef < columnCount) {
var funArray = columnSet.FunctionColumns.ToArray();
var refExp = funArray[colRef];
resolved = new SortColumn(refExp.Expression, column.Ascending);
}
}
}
resolvedColumns.Add(resolved);
}
return resolvedColumns.ToArray();
}