public static IQueryable <TQuery> FilterMutatorPager <TQuery, TSearch>(
     this IQueryable <TQuery> collection,
     SearchFieldMutators <TQuery, TSearch> searchRules,
     TSearch modelSearch) where TSearch : IFilterMutatorPager
 {
     return(searchRules.Aggregate(collection, (current, mutator) => mutator.Apply(current, modelSearch)).Skip(modelSearch.ItemsToSkip).Take(modelSearch.ItemsPerPage));
 }
 public static IQueryable <TQuery> FilterMutator <TQuery, TSearch>(
     this IQueryable <TQuery> collection,
     SearchFieldMutators <TQuery, TSearch> searchRules,
     TSearch modelSearch)
 {
     return(searchRules.Aggregate(collection, (current, mutator) => mutator.Apply(current, modelSearch)));
 }
        public void Test2()
        {
            var searchRules = new SearchFieldMutators <User, SearchFieldVM>();

            searchRules.Add(
                test => !string.IsNullOrWhiteSpace(test.InputText),
                (query, search) => query.Where(x => x.Name.Contains(search.InputText)));

            searchRules.Add(
                test => test.MinAge > 0,
                (query, search) => query.Where(x => x.Age >= search.MinAge));

            searchRules.Add(
                test => test.MaxAge > 0,
                (query, search) => query.Where(x => x.Age <= search.MaxAge));

            SearchFieldVM modelSearch = new SearchFieldVM()
            {
                InputText = null,
                MinAge    = 17,
                MaxAge    = 19
            };

            var collection = userRepository.AsQueryable();

            collection = collection.FilterMutator <User, SearchFieldVM>(searchRules, modelSearch);
            Assert.Equal(2, collection.Count());
        }