コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }