Beispiel #1
0
 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;
        }