private void SetCosmosEndOfDataMarker(IPagingData pagingData) { var cosmosPagingData = (CosmosPagingData)pagingData; cosmosPagingData.ContinuationToken = CosmosPages.Count > 1 ? Guid.NewGuid().ToString() : null; cosmosPagingData.CurrentPageSize = CosmosPages.Count > 0 ? CosmosPages[CosmosPages.Count - 1].Length : 0; }
/// <summary> /// 获取分页器的最大页数 /// </summary> /// <param name="pagingData">数据分页器</param> /// <returns></returns> public static int MaxPages(this IPagingData pagingData) { int count = pagingData.Count(); int pageSize = pagingData.PageSize; return(count / pageSize + ((count % pageSize) == 0 ? 0 : 1)); }
public static Pager Pager(this HtmlHelper htmlHelper, IPagingData pagingData) { var pager = htmlHelper.Pager(pagingData.ItemsBase.PageSize, pagingData.ItemsBase.PageNumber, pagingData.ItemsBase.TotalItemCount, new AjaxOptions { UpdateTargetId = pagingData.ContainerName }); var routeValues = pagingData.RouteValues ?? new RouteValueDictionary(); // Because of a bug in MVCPaging 2.0.1 the action parameter needs to be specified in routevalues as well if (!string.IsNullOrEmpty(pagingData.Action) && !routeValues.ContainsKey("action")) { routeValues.Add("action", pagingData.Action); } if (pagingData.Id != null && !routeValues.ContainsKey("id")) { routeValues.Add("id", pagingData.Id); } if (pagingData.AddTotalCount && !routeValues.ContainsKey("totalCount")) { routeValues.Add("totalCount", pagingData.ItemsBase.TotalItemCount); } pager = pager.Options(o => o.RouteValues(routeValues)); return(pager); }
public async Task <Activity[]> GetActivitiesAsync(IPagingData pagingData) { if (!(pagingData is ElasticPagingData elasticPagingData)) { throw new InvalidQueryPagingData( $"paging data supplied to {nameof(ElasticActivityDocumentRepository)} is not a {nameof(ElasticPagingData)}"); } // See https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html // for a description of deep paging issues var dbQuery = await _client.SearchAsync <Activity>(s => s .From(elasticPagingData.FromIndex) .Size(pagingData.RequiredPageSize) .Sort(srt => srt.Ascending(a => a.Id)) .Query(q => q.MatchAll())); var activities = dbQuery.Documents.ToArray(); elasticPagingData.FromIndex += activities.Length; elasticPagingData.CurrentPageSize = activities.Length; activities.AssertInIdOrder(); return(activities); }
public async Task <Activity[]> GetActivitiesAsync(IPagingData pagingData) { if (!(pagingData is CosmosPagingData cosmosPagingData)) { throw new InvalidQueryPagingData( $"paging data supplied to {nameof(CosmosActivityDocumentRepository)} is not a {nameof(CosmosPagingData)}"); } var cosmosResults = await _cosmosClient.GetPageAsync <CosmosActivity, Guid>(_config.CosmosCollectionName, cosmosPagingData.ContinuationToken, documentType => documentType.MessageId, pagingData.RequiredPageSize); cosmosPagingData.ContinuationToken = cosmosResults.ContinuationToken; var activities = cosmosResults.Items.Select(ca => ca.Activity).ToArray(); cosmosPagingData.CurrentPageSize = activities.Length; activities.AssertInIdOrder(); return(activities); }
private async Task <IEnumerable <Activity> > FetchNextPageOfActivities(IPagingData pagingData) { var thisFetchId = Interlocked.Increment(ref _fetchId); _logger.Debug($"Fetch id:{thisFetchId} request-page-size:{pagingData.RequiredPageSize} repo:{pagingData.Repository.GetType().Name}"); var haveReachedLimit = !pagingData.MoreDataAvailable || ( pagingData.MaximumInspections.HasValue && pagingData.MaximumInspections <= pagingData.Inspections); if (haveReachedLimit) { _logger.Debug($"Fetch id:{thisFetchId} terminating MoreDataAvailable:{pagingData.MoreDataAvailable} TotalInspections:{pagingData.Inspections} MaximumInspections:{pagingData.MaximumInspections??-1}"); pagingData.CurrentPageSize = 0; return(new Activity[0]); } var page = await pagingData.Repository.GetActivitiesAsync(pagingData); pagingData.Inspections = pagingData.Inspections + page.Length; _logger.Debug($"Fetch id:{thisFetchId} actual-page-size:{page.Length} inspections-so-far:{pagingData.Inspections} max-inspections:{pagingData.MaximumInspections} has-more-data:{pagingData.MoreDataAvailable}"); return(page); }
public PagingSelector(IPagingData <TSource> source, Func <IEnumerable <TSource>, IEnumerable <TResult> > pageConverter) { _dataSource = source; _pageSelector = pageConverter; }
public PagingSelector(IPagingData <TSource> source, Func <TSource, TResult> selector) { _dataSource = source; _selector = selector; }
/// <summary> /// 对分页数据中的每一页进行指定映射操作,得到一个新的分页数据 /// </summary> /// <typeparam name="TSource">源分页数据类型</typeparam> /// <typeparam name="TResult">映射后的类型</typeparam> /// <param name="source">数据源</param> /// <param name="pageSelector">映射函数</param> /// <returns>执行映射操作后的分页数据</returns> public static IPagingData <TResult> PageSelect <TSource, TResult>(this IPagingData <TSource> source, Func <IEnumerable <TSource>, IEnumerable <TResult> > pageSelector) { return(new PagingSelector <TSource, TResult>(source, pageSelector)); }
/// <summary> /// 对分页数据中的每一项进行指定映射操作,得到一个新的分页数据 /// </summary> /// <typeparam name="TSource">源分页数据类型</typeparam> /// <typeparam name="TResult">映射后的类型</typeparam> /// <param name="source">数据源</param> /// <param name="selector">映射函数</param> /// <returns>执行映射操作后的分页数据</returns> public static IPagingData <TResult> Select <TSource, TResult>(this IPagingData <TSource> source, Func <TSource, TResult> selector) { return(new PagingSelector <TSource, TResult>(source, selector)); }
public ActivityPageResult(Activity[] activities, IPagingData pagingData) { Activities = activities; PagingData = pagingData; }
private void SetElasticEndOfDataMarker(IPagingData pagingData) { var elasticPagingData = (ElasticPagingData)pagingData; elasticPagingData.CurrentPageSize = ElasticPages.Count > 0 ? ElasticPages[0].Length : 0; }