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