public virtual IQueryable <TSourceData> ApplyOrdering(IQueryable <TSourceData> source, Query request) { if (request.Orderings == null) { return(source); } bool orderingPerformed = false; foreach (var ordering in request.Orderings) { if (ordering.Value == Ordering.Neutral) { continue; } var srcOrderingExpr = _configuration.GetOrderingExpression(ordering.Key); if (srcOrderingExpr == null) { continue; } if (ordering.Value == Ordering.Ascending) { if (!orderingPerformed) { source = ReflectionCache.CallOrderBy(source, srcOrderingExpr, srcOrderingExpr.Body.Type); orderingPerformed = true; } else { source = ReflectionCache.CallThenBy(source, srcOrderingExpr, srcOrderingExpr.Body.Type); } } if (ordering.Value == Ordering.Descending) { if (!orderingPerformed) { source = ReflectionCache.CallOrderByDescending(source, srcOrderingExpr, srcOrderingExpr.Body.Type); orderingPerformed = true; } else { source = ReflectionCache.CallThenByDescending(source, srcOrderingExpr, srcOrderingExpr.Body.Type); } } } if (!orderingPerformed && _configuration.FallbackOrdering != null) { source = ReflectionCache.CallOrderByDescending(source, _configuration.FallbackOrdering, _configuration.FallbackOrdering.Body.Type); } return(source); }