private string CacheKey(Expression <Func <T, bool> > predicate = null, PagedSpecification <T> paging = null)
        {
            var identity = new StringBuilder();

            if (predicate != null)
            {
                Expression expression = predicate;

                // locally evaluate as much of the query as possible
                expression = Evaluator.PartialEval(expression);

                // support local collections
                expression = LocalCollectionExpander.Rewrite(expression);
                identity.Append(expression);
            }
            else
            {
                identity.Append("All");
            }

            if (paging?.PageNumber > 0)
            {
                identity.AppendFormat("|page:{0}", paging.PageNumber);
            }

            if (paging?.PageSize > 0)
            {
                identity.AppendFormat("|size:{0}", paging.PageSize);
            }

            if (paging?.Sorting != null)
            {
                identity.AppendFormat("|orderby:{0}", paging.Sorting);
            }

            var hash = ComputeHash(identity.ToString());

            return(string.Concat(typeof(T).FullName, "/", GetGeneration(), "/", hash));
        }
예제 #2
0
        public List <T> GetPage(int page, int resultsPerPage, string orderBy, Func <string, Expression <Func <T, object> > > map, bool desc = false, ISpecification <T> spec = null)
        {
            PagedSpecification <T> spec1 = new PagedSpecification <T>(map);

            spec1.ApplyOrderBy(orderBy, desc);
            spec1.Apply(page * resultsPerPage, resultsPerPage);
            if (spec == null)
            {
                return(base.GetPage(page, resultsPerPage,
                                    new List <ISort>()
                {
                    SpecificationEvaluator <T, TKey> .GetSort(spec1)
                }));
            }
            else
            {
                return(base.GetPage(page, resultsPerPage,
                                    new List <ISort>()
                {
                    SpecificationEvaluator <T, TKey> .GetSort(spec1)
                },
                                    SpecificationEvaluator <T, TKey> .GetQuery(spec)));
            }
        }
예제 #3
0
        public IQueryable <T> Build(IRepository repository)
        {
            IQueryable <T> query;

            if (_include != null)
            {
                var loadService = repository.As <ILoadService <T> >().Include(_include);
                query = loadService.All();
            }
            else
            {
                query = repository.All <T>();
            }

            if (_query != null && _pageNumber != 0 && _pageSize != 0)
            {
                var paging = new PagedSpecification <T>((Specification <T>)_query).Page(_pageNumber, _pageSize);
                query = paging.Apply(query);
            }
            else if (_query != null)
            {
                query = _query.Apply(query);
            }
            else if (_pageNumber != 0 && _pageSize != 0)
            {
                var paging = new PagedSpecification <T>(Specification <T> .AlwaysTrue).Page(_pageNumber, _pageSize);
                query = paging.Apply(query);
            }

            if (_orderBy != null)
            {
                query = _orderBy.Apply(query);
            }

            return(query);
        }