/// <summary> /// Parse traditional SQL order-by statement into a SortKeyList. /// </summary> /// <remarks><para>The order-by input is a comma separated string of fields names with added direction keywords. /// For instance "Title, Age desc". The field names are case-sensitive whereas the direction keywords are case-insensitive. /// Possible values for the direction keywords are "ascending", "descending", "asc", "desc".</para> /// <para>Developers should actually try to avoid using this method. It is primarily here to connect GUI and code where the GUI /// cannot produce the <c>Func<TSource,object></c> objects directly.</para></remarks> /// <param name="orderBy">Order-by string.</param> /// <returns>A SortKeyList representing the order-by string.</returns> public static SortKeyList <TSource> CreateKeyList(string orderBy) { SortKeyList <TSource> list = new SortKeyList <TSource>(); if (orderBy == null) { return(list); } orderBy = orderBy.Trim(); if (orderBy.Length == 0) { return(list); } string[] parts = orderBy.Split(','); Type sourceType = typeof(TSource); foreach (string part in parts) { string[] keydir = part.Trim().Split(' '); string key = keydir[0].Trim(); string dirstr = (keydir.Length > 1 ? keydir[1].Trim() : null); SortKeyDirection dir = ParseDirection(dirstr); list.AddKey(dir, ParseFieldReference(sourceType, key)); } return(list); }
public static SortKeyList <TSource> CreateKeyList(SortKeyDirection direction, Expression <Func <TSource, object> > key) { SortKeyList <TSource> list = new SortKeyList <TSource>(); list.Add(new SortKey <TSource>(direction, key)); return(list); }
public static IQueryable <TSource> OrderBy <TSource>(this IQueryable <TSource> query, SortKeyList <TSource> sortKeys) { if (sortKeys != null && sortKeys.Count > 0) { IOrderedQueryable <TSource> orderedQuery; var sortKey0 = sortKeys[0]; if (sortKey0.Direction == SortKeyDirection.Ascending) { orderedQuery = query.OrderBy(sortKey0.Key); } else { orderedQuery = query.OrderByDescending(sortKey0.Key); } for (int i = 1; i < sortKeys.Count; ++i) { var sortKey = sortKeys[i]; if (sortKey.Direction == SortKeyDirection.Ascending) { orderedQuery = orderedQuery.ThenBy(sortKey.Key); } else { orderedQuery = orderedQuery.ThenByDescending(sortKey.Key); } } query = orderedQuery; } return(query); }
public static IQueryable <TSource> OrderByPaged <TSource>(this IQueryable <TSource> query, int pageIndex, int pageSize, SortKeyList <TSource> sortKeys) { return(query.OrderBy(sortKeys).Skip(pageIndex * pageSize).Take(pageSize)); }
public static IEnumerable <TSource> OrderBy <TSource>(this IEnumerable <TSource> query, string sortKey) { return(OrderBy(query, SortKeyList <TSource> .CreateKeyList(sortKey))); }