public async Task <IEnumerable <UserInfo> > GetProjectLikersSequenceAsync(string projectId, DataQueryOptions filter) { var result = new List <UserInfo>(); IEnumerable <DomainItemSignal> data = await _cassandraStatisticsService.GetItemLikesSequenceAsync(StatisticsSpaces.Projects, projectId, MemoryPageSize); var pageData = new List <DomainItemSignal>(); int count = 0; int skip = filter != null && filter.Skip.HasValue ? filter.Skip.Value : 0; foreach (DomainItemSignal user in data) { if (result.Count >= MemoryPageSize || count > MemoryPageSize * MaxScanPages) { // memory limit reached break; } if (filter != null && filter.Take.HasValue && result.Count >= filter.Take.Value + skip) { // all items loaded break; } // adding to page pageData.Add(user); // checking limits if ((count > 0 && count % MemoryPageSize == 0) || (filter != null && filter.Take.HasValue && pageData.Count >= filter.Take.Value)) { // loading and filtering items List <UserInfo> page = await LoadUserPageDataAsync(pageData); result.AddRange(page); pageData.Clear(); } count++; } if (pageData.Count > 0) { // loading last page List <UserInfo> page = await LoadUserPageDataAsync(pageData); result.AddRange(page); pageData.Clear(); } // Skip result = result.Skip(skip).ToList(); // Take if (filter != null && filter.Take.HasValue) { result = result.Take(filter.Take.Value).ToList(); } return(result); }