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()
            });
        }
示例#2
0
        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);
        }
示例#3
0
        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));
            }
        }