/// <summary> /// Pagina y ejecuta la consulta especificada. /// Este método debe ejecutarse en el tiempo de vida de un contexto. /// Si se ejecuta fuera de un contexto arrojará una excepción de EF. /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="query">Consulta a paginar y ejecutar</param> /// <param name="pageable">Opciones de paginación</param> /// <returns></returns> public static async Task <Page <TResult> > PaginateQueryAsync <TResult>( this IQueryable <TResult> query, Pageable pageable ) { pageable.ThrowIfNull(nameof(pageable)); var pageSize = pageable.PageSize; var pageNumber = pageable.PageNumber; var totalRecords = await query.CountAsync(); var totalPages = (int)Math.Ceiling((decimal)totalRecords / (decimal)pageSize); var items = await query .Skip(pageNumber *pageSize) .Take(pageSize) .ToListAsync(); return(new Page <TResult>(items, totalPages)); }