protected override void VisitSortKey(ODataSortKeyExpression node) { this.Write(node.Expression) .Write(" DESC", @if: node.Descending); }
private static IQueryable<TElement> ApplyOrderBy<TElement>(IQueryable<TElement> query, ODataSortKeyExpression sortKey, bool isPrimarySort) { var parameter = Expression.Parameter(typeof(TElement)); var translated = Translate(parameter, sortKey.Expression); var lambda = Expression.Lambda(translated, parameter); var methodName = (isPrimarySort ? "OrderBy" : "ThenBy") + (sortKey.Descending ? "Descending" : string.Empty); MethodInfo method; switch (methodName) { case "OrderBy": method = Helpers.GetMethod((IQueryable<object> q) => q.OrderBy(o => o)); break; case "OrderByDescending": method = Helpers.GetMethod((IQueryable<object> q) => q.OrderByDescending(o => o)); break; case "ThenBy": method = Helpers.GetMethod((IOrderedQueryable<object> q) => q.ThenBy(o => o)); break; case "ThenByDescending": method = Helpers.GetMethod((IOrderedQueryable<object> q) => q.ThenByDescending(o => o)); break; default: throw Throw.UnexpectedCase(methodName); } var denormalizedLambda = ODataEntity.Denormalize(lambda); var result = method.GetGenericMethodDefinition() .MakeGenericMethod(lambda.Type.GetGenericArguments(typeof(Func<,>))) .Invoke(null, new object[] { query, denormalizedLambda }); return (IQueryable<TElement>)result; }