private async Task <ReadResult <TKey, TEntry> > ReadRangeInternal(TKey id, DateTime from, DateTime to, Sort sort) { // there's twos ways to accomplish this take: // 1. Super fast (iterate partitions and create query for each) // 2. Normal (use single query) if (_partitioningProvider is IIterablePartitionProvider <TKey> ) { // use method 1 (Super fast) var tasks = new List <Task <List <TEntry> > >(); var iterable = (IIterablePartitionProvider <TKey>)_partitioningProvider; foreach (var table in _tableProvider.IterateTables(from, to)) { var computedFrom = table.ComputeFrom(from); var computedTo = table.ComputeTo(to); foreach (var partitionRange in iterable.IteratePartitions(id, computedFrom, computedTo)) { var specificQuery = new TableQuery <TsdbTableEntity>() .Where(CreateSpecificPartitionFilter(id, computedFrom, computedTo, partitionRange)); tasks.Add(ReadInternal(specificQuery, table, sort, null)); } } await Task.WhenAll(tasks).ConfigureAwait(false); var queryResults = tasks.Select(x => x.Result); if (sort == Sort.Ascending) { queryResults = queryResults.Reverse(); } // combine the results and return it return(new ReadResult <TKey, TEntry>(id, sort, queryResults.SelectMany(x => x).ToList())); } else { // use method 2 (Normal) var generalQuery = new TableQuery <TsdbTableEntity>() .Where(CreateGeneralFilter(id, from, to)); var tasks = new List <Task <List <TEntry> > >(); foreach (var table in _tableProvider.IterateTables(from, to)) { tasks.Add(ReadInternal(generalQuery, table, sort, null)); } await Task.WhenAll(tasks).ConfigureAwait(false); var queryResults = tasks.Select(x => x.Result); if (sort == Sort.Ascending) { queryResults = queryResults.Reverse(); } return(new ReadResult <TKey, TEntry>(id, sort, queryResults.SelectMany(x => x).ToList())); } }