Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- message Pagination {
- string pageToken = 1;
- int32 pageSize = 2;
- }
- */
- public static class Extensions
- {
- public static async Task<PagedResponse<T>> ToPagedResponseAsync<T>(this IQueryable<T> source, Pagination pagination)
- {
- if (source == null)
- {
- throw new ArgumentNullException(nameof(source));
- }
- pagination ??= new Pagination {PageSize = 10};
- var totalCount = await source.CountAsync();
- var skip = GetSkip();
- var items = await source
- .Skip(skip)
- .Take(pagination.PageSize)
- .ToListAsync();
- return new PagedResponse<T>
- {
- Items = items,
- NextPageToken = GetNextPageToken()
- };
- int GetSkip()
- {
- if (string.IsNullOrEmpty(pagination.PageToken))
- {
- return 0;
- }
- try
- {
- var bytes = Convert.FromBase64String(pagination.PageToken);
- return BitConverter.ToInt32(bytes);
- }
- catch (Exception e)
- {
- throw new ArgumentException("Could not decode page token", e);
- }
- }
- string GetNextPageToken()
- {
- var nextSkip = skip + pagination.PageSize;
- if (nextSkip >= totalCount)
- {
- return string.Empty;
- }
- var bytes = BitConverter.GetBytes(nextSkip);
- return Convert.ToBase64String(bytes);
- }
- }
- }
Add Comment
Please, Sign In to add comment