Example #1
0
 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));
 }
Example #2
0
        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));
        }