private IQueryable <TModel> FormFetchQuery <TModel>(FetchParameters <TModel> fetchParameters) where TModel : class
        {
            Check.NotNull(fetchParameters, "fetchParameters");
            // !IMPORTANT! Call order DOES matter!
            // 1 Build Query
            var queriedItems = Query(fetchParameters);

            if (fetchParameters.NoTracking)
            {
                queriedItems = queriedItems.AsNoTracking();
            }

            // 2 Sorting
            if (fetchParameters.HasSorting())
            {
                queriedItems = fetchParameters.PerformSorting(queriedItems);
            }
            else
            {
                // HACK: https://stackoverflow.com/a/14524571/3469518
                // this hack required for paging
                queriedItems = queriedItems.OrderBy(x => 0);
            }


            // 3 Filtering
            return(fetchParameters.PerformFiltering(queriedItems));
        }
Example #2
0
        internal static IQueryable <TModel> PerformSorting <TModel>(this FetchParameters <TModel> target, IQueryable <TModel> queriedItems) where TModel : class
        {
            if (target.HasSorting())
            {
                var rules = target.SortingRules.Where(x => x != null);
                if (!rules.Any())
                {
                    return(queriedItems);                    // sanity check
                }

                foreach (var sortingRule in rules)
                {
                    queriedItems = queriedItems.OrderBy(sortingRule);
                }
            }
            return(queriedItems);
        }