示例#1
0
        public override PagedResult <TKey, TAggregateRoot> FindAll(Expression <Func <TAggregateRoot, bool> > specification, SortSpecification <TKey, TAggregateRoot> sortSpecification, int pageNumber, int pageSize)
        {
            if (specification == null)
            {
                specification = _ => true;
            }

            if (sortSpecification?.Count == 0)
            {
                throw new ArgumentNullException(nameof(sortSpecification), "The sort specification has not been specified.");
            }

            if (pageNumber <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(pageNumber), "The page number should be greater than 0.");
            }

            if (pageSize <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(pageSize), "The page size should be greater than 0.");
            }

            var sorts = sortSpecification.Specifications.ToList();

            if (sorts.Any(s => s.Item2 == SortOrder.Unspecified))
            {
                throw new InvalidOperationException("The SortOrder of the items in the sort specification should be either Ascending or Descending.");
            }

            var query = this.dbContext.Set <TAggregateRoot>().Where(specification);
            var total = query.Count();

            if (total == 0)
            {
                return(PagedResult <TKey, TAggregateRoot> .CreateDefault(pageNumber, pageSize));
            }

            var skip = (pageNumber - 1) * pageSize;
            var take = pageSize;

            IOrderedQueryable <TAggregateRoot> orderedQuery = null;

            foreach (var sort in sorts)
            {
                switch (sort.Item2)
                {
                case SortOrder.Ascending:
                    orderedQuery = orderedQuery == null?query.OrderBy(sort.Item1) : orderedQuery.OrderBy(sort.Item1);

                    break;

                case SortOrder.Descending:
                    orderedQuery = orderedQuery == null?query.OrderByDescending(sort.Item1) : orderedQuery.OrderByDescending(sort.Item1);

                    break;
                }
            }

            //var pagedQuery = orderedQuery.Skip(skip).Take(take).GroupBy(p => new { Total = total }).FirstOrDefault();
            //return pagedQuery == null ? null :
            //    new PagedResult<TKey, TAggregateRoot>(pagedQuery.Select(_ => _), pageNumber, pageSize, pagedQuery.Key.Total, (pagedQuery.Key.Total + pageSize - 1) / pageSize);
            var pagedQuery = orderedQuery.Skip(skip).Take(take);

            return(pagedQuery == null ? null :
                   new PagedResult <TKey, TAggregateRoot>(pagedQuery, pageNumber, pageSize, total, (total + pageSize - 1) / pageSize));
        }