/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="q"></param> /// <param name="orderString">Id asc,Age desc...</param> /// <returns></returns> public static IOrderedQuery <T> OrderBy <T>(this IQuery <T> q, string orderString) { if (q == null) { throw new ArgumentNullException("q"); } if (string.IsNullOrEmpty(orderString)) { throw new ArgumentNullException("orderString"); } List <Ordering> orderingList = SplitOrderingString(orderString); IOrderedQuery <T> orderedQuery = null; for (int i = 0; i < orderingList.Count; i++) { Ordering ordering = orderingList[i]; if (orderedQuery == null) { orderedQuery = q.InnerOrderBy(ordering); } else { orderedQuery = orderedQuery.InnerThenBy(ordering); } } return(orderedQuery); }
static IOrderedQuery <T> Invoke <T>(object q, MethodInfo orderMethod, LambdaExpression keySelector) { orderMethod = orderMethod.MakeGenericMethod(new Type[] { keySelector.Body.Type }); IOrderedQuery <T> orderedQuery = (IOrderedQuery <T>)orderMethod.FastInvoke(q, new object[] { keySelector }); return(orderedQuery); }
static IOrderedQuery <T> Invoke <T>(object q, MethodInfo orderMethod, LambdaExpression predicate) { orderMethod = orderMethod.MakeGenericMethod(new Type[] { predicate.Body.Type }); IOrderedQuery <T> orderedQuery = (IOrderedQuery <T>)orderMethod.Invoke(q, new object[] { predicate }); return(orderedQuery); }
/// <summary> /// Builds a ordered result query from a queryable, that assumes client side paging. /// </summary> /// <typeparam name="TIn">The type of the t in.</typeparam> /// <typeparam name="TOut">The type of the t out.</typeparam> /// <param name="qry">The qry.</param> /// <param name="request">The request.</param> /// <param name="projection">Select projection</param> /// <param name="serializeSettings">Map serialize settings</param> /// <returns>Task<List<TOut>>.</returns> public static IQueryable OrderedResultsQuery <TIn, TOut>(this IQueryable <TIn> qry, IOrderedQuery request, Func <TIn, TOut> projection = null, JsonSerializerSettings serializeSettings = null ) where TOut : new() { var result = qry.BuildOrderedQueryable(request) .BuildOutputQueryable(projection, serializeSettings); Console.WriteLine(result.Expression.ToString()); return(result); }
static IOrderedQuery <T> InnerThenBy <T>(this IOrderedQuery <T> q, Ordering ordering) { LambdaExpression predicate = GetOrderPredicate <T>(ordering.MemberChain); MethodInfo orderMethod; if (ordering.OrderType == OrderType.Asc) { orderMethod = typeof(IOrderedQuery <T>).GetMethod("ThenBy"); } else { orderMethod = typeof(IOrderedQuery <T>).GetMethod("ThenByDesc"); } IOrderedQuery <T> orderedQuery = Invoke <T>(q, orderMethod, predicate); return(orderedQuery); }
static IOrderedQuery <T> InnerThenBy <T>(this IOrderedQuery <T> q, Ordering ordering) { LambdaExpression keySelector = ConvertToLambda <T>(ordering.MemberChain); MethodInfo orderMethod; if (ordering.OrderType == OrderType.Asc) { orderMethod = typeof(IOrderedQuery <T>).GetMethod("ThenBy"); } else { orderMethod = typeof(IOrderedQuery <T>).GetMethod("ThenByDesc"); } IOrderedQuery <T> orderedQuery = Invoke <T>(q, orderMethod, keySelector); return(orderedQuery); }
/// <summary> /// Configures sorted matching facts to subsequently be sorted descending by key. /// </summary> /// <typeparam name="TSource">Type of source facts.</typeparam> /// <typeparam name="TKey">Type of sorting key.</typeparam> /// <param name="source">Query expression builder.</param> /// <param name="keySelector">Key selection expression used for sorting.</param> /// <returns>Query expression builder.</returns> public static IOrderedQuery <IEnumerable <TSource> > ThenByDescending <TSource, TKey>(this IOrderedQuery <IEnumerable <TSource> > source, Expression <Func <TSource, TKey> > keySelector) { source.Builder.OrderBy(keySelector, SortDirection.Descending); return(new QueryExpression <IEnumerable <TSource> >(source.Builder)); }
private static IQueryable <TIn> BuildOrderedQueryable <TIn>(this IQueryable <TIn> source, IOrderedQuery request ) { return(request.OrderBy.IsEmptyNullOrWhiteSpace() ? source : source.OrderBy(request.OrderBy)); }