public Task BindModelAsync(ModelBindingContext bindingContext) { var valueName = string.IsNullOrEmpty(bindingContext.ModelName) ? bindingContext.ModelMetadata.Name : bindingContext.ModelName; var limit = PagingParameters.DefaultLimit; var cursor = PagingCursor.Start; if (bindingContext.TryGetValue <int>("limit", out var limitResult)) { limit = limitResult.Value; } if (bindingContext.TryGetStringValue("cursor", out var cursorResult)) { cursor = new PagingCursor(cursorResult.Value); } var pagingParameters = new PagingParameters(cursor, limit).Coerce(); bindingContext.ModelState.MarkFieldValid(valueName); bindingContext.Result = ModelBindingResult.Success(pagingParameters); return(Task.CompletedTask); }
public static async Task <PagingResult <T> > ToPagedResult <T>(this IQueryable <T> input, PagingParameters pagingParameters, CancellationToken cancellationToken) { if (input == null) { throw new ArgumentNullException(nameof(input)); } if (pagingParameters == null) { throw new ArgumentNullException(nameof(pagingParameters)); } var offset = pagingParameters.Cursor.IsStart ? 0 : long.Parse(pagingParameters.Cursor.ToString()); var totalCount = await input.LongCountAsync(cancellationToken).ConfigureAwait(false); var resultItems = await input.Skip((int)offset).Take(pagingParameters.Limit).ToListAsync(cancellationToken) .ConfigureAwait(false); var continuationCursor = PagingCursor.FromOffset(offset + resultItems.Count); return(new PagingResult <T>(resultItems, totalCount, continuationCursor)); }