public static async Task <PagedListResult <TOutput> > PaginateListResultAsync <TInput, TOutput>( this Microsoft.Azure.Cosmos.Table.CloudTable table, Microsoft.Azure.Cosmos.Table.TableQuery <TInput> query, int pageSize, Func <TInput, Task <TOutput> > conversion, CosmosTableBasedContinuationToken continuationToken, CancellationToken cancelationToken = default(CancellationToken)) where TInput : Microsoft.Azure.Cosmos.Table.ITableEntity, new() { var items = new List <TOutput>(); var token = continuationToken.IsContinuation ? continuationToken.TableCursor : null; var oc = new Microsoft.Azure.Cosmos.Table.OperationContext(); var ro = new Microsoft.Azure.Cosmos.Table.TableRequestOptions(); query = query.Take(pageSize); var seg = await table.ExecuteQuerySegmentedAsync(query, token, ro, oc, cancelationToken); continuationToken.TableCursor = seg.ContinuationToken; items.AddRange( (await Task.WhenAll(seg.Select(async x => await conversion(x)))) .Where(x => x != null) ); return(new PagedListResult <TOutput> { Items = items, ContinuationToken = continuationToken?.ToString() }); }
private async Task <Dictionary <string, bool> > Get(IServiceProvider services, Dictionary <string, bool> result) { string filter = null; foreach (var name in result.Keys) { var f = Microsoft.Azure.Cosmos.Table.TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, name); if (filter == null) { filter = f; } else { filter = Microsoft.Azure.Cosmos.Table.TableQuery.CombineFilters(filter, Microsoft.Azure.Cosmos.Table.TableOperators.Or, f); } } var query = new Microsoft.Azure.Cosmos.Table.TableQuery <FeatureEntryTableEntity>() .Where( Microsoft.Azure.Cosmos.Table.TableQuery.CombineFilters( Microsoft.Azure.Cosmos.Table.TableQuery.GenerateFilterCondition("PartitionKey", Microsoft.Azure.Cosmos.Table.QueryComparisons.Equal, GatePartitionKey), Microsoft.Azure.Cosmos.Table.TableOperators.And, filter) ); var results = await Storage.ExecuteQuerySegmentedAsync(query); foreach (var featureRow in results) { try { var feature = featureRow.To <FeatureEntry>(); result[feature.Name] = feature != null && await feature.IsEnabled(services); } catch (Exception ex) { logger_.LogCritical(ex, "FG storage has badly formed featreu : {FeatureName}", featureRow.RowKey); result[featureRow.RowKey] = false; } } return(result); }
public async Task <PagedListResult <FeatureDetail> > GetFeatures(string continuationToken) { if (newGates_) { var table = featureStore_.Value.Storage; var query = new Microsoft.Azure.Cosmos.Table.TableQuery <FeatureEntryTableEntity>() .Where(Microsoft.Azure.Cosmos.Table.TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, FeatureGateStore.GatePartitionKey)); var token = new CosmosTableBasedContinuationToken(continuationToken); return(await table.PaginateListResultAsync(query, 30, x => Task.FromResult(x.To <FeatureEntry>().ToFeatureDetail()), token)); } else { var table = featureStore_.Value.GatesTable.Table; var query = new TableQuery <LegacyFeatureEntry>() .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, FeatureGateStore.GatePartitionKey)); var token = new CloudTableBasedContinuationToken(continuationToken); return(await table.PaginateListResult(query, x => x.ToFeatureDetail(), token)); } }