Beispiel #1
0
        /// <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&lt;TSource,object&gt;</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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 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));
 }
Beispiel #5
0
 public static IEnumerable <TSource> OrderBy <TSource>(this IEnumerable <TSource> query, string sortKey)
 {
     return(OrderBy(query, SortKeyList <TSource> .CreateKeyList(sortKey)));
 }