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)); }
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); }