public static async Task <PaginatedItem <TResponse> > QueryAsync <TDbContext, TEntity, TEntityId, TResponse>( this IQueryRepository <TEntity, TEntityId> repo, PaginateCriteria paginateCriteria, Expression <Func <TEntity, TResponse> > selector, Func <IQueryable <TEntity>, IIncludableQueryable <TEntity, object> > include = null, bool disableTracking = true) where TDbContext : DbContext where TEntity : class, IAggregateRoot <TEntityId> { return(await GetDataAsync <TDbContext, TEntity, TEntityId, TResponse>(repo, paginateCriteria, selector, null, include, disableTracking)); }
private static async Task <PaginatedItem <TResponse> > GetDataAsync <TDbContext, TEntity, TEntityId, TResponse>( IQueryRepository <TEntity, TEntityId> repo, PaginateCriteria paginateCriteria, Expression <Func <TEntity, TResponse> > selector, Expression <Func <TEntity, bool> > filter = null, Func <IQueryable <TEntity>, IIncludableQueryable <TEntity, object> > include = null, bool disableTracking = true) where TDbContext : DbContext where TEntity : class, IAggregateRoot <TEntityId> { var queryable = repo.Queryable(); if (disableTracking) { queryable = queryable.AsNoTracking(); } if (include != null) { queryable = include.Invoke(queryable); } if (filter != null) { queryable = queryable.Where(filter); } if (!string.IsNullOrWhiteSpace(paginateCriteria.SortBy)) { var isDesc = string.Equals(paginateCriteria.SortOrder, "desc", StringComparison.OrdinalIgnoreCase) ? true : false; queryable = queryable.OrderByPropertyName <TEntity, TEntityId>(paginateCriteria.SortBy, isDesc); } var results = await queryable .Skip(paginateCriteria.CurrentPage *paginateCriteria.PageSize) .Take(paginateCriteria.PageSize) .Select(selector) .ToListAsync(); var totalRecord = await queryable.CountAsync(); var totalPages = (int)Math.Ceiling((double)totalRecord / paginateCriteria.PageSize); if (paginateCriteria.CurrentPage > totalPages) { paginateCriteria.SetCurrentPage(totalPages); } return(new PaginatedItem <TResponse>(totalRecord, totalPages, results)); }