Получите более 1000 наборов данных из Azure Table Storage - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть Azure функция для выполнения некоторых операций над наборами данных в Azure табличном хранилище.

Поскольку группировка не работает в Azure табличных хранилищах, я должен получить все наборы данных в моей таблице и выполнить необходимые операции (группировка, фильтрация) в моем коде C#.

Но каждый запрос извлекает только первые 1000 наборов данных. Как я могу получить все свои наборы данных или перебрать таблицу по 1000 штук, чтобы получить все наборы данных в конце?

TableQuery<Models.product_item> query = new TableQuery<Models.product_item>()
          .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myPartitionKey));

var queryResult = myTable.ExecuteQuery(query);

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Если ваш запрос не завершился в определенных пределах (макс. 5 секунд, макс. 1000 строк, см. здесь ), вы получите ContinuationToken в вашем объекте результата. Передайте этот токен другому запросу, чтобы продолжить ваш первый запрос и получить следующую группу строк.

Этот метод расширения сделает вашу работу за вас:

public static class QueryExtensions
{
    public static async Task<IEnumerable<TElement>> ExecuteQueryAllElementsAsync<TElement>(this CloudTable table, TableQuery<TElement> tableQuery)
        where TElement : ITableEntity, new()
    {
        TableContinuationToken continuationToken = default(TableContinuationToken);
        var results = new List<TElement>(0);
        tableQuery.TakeCount = 500;

        do
        {
            //Execute the next query segment async.
            var queryResult = await table.ExecuteQuerySegmentedAsync(tableQuery, continuationToken);

            //Set exact results list capacity with result count.
            results.Capacity += queryResult.Results.Count;
            results.AddRange(queryResult.Results);

            continuationToken = queryResult.ContinuationToken;

        } while (continuationToken != null);

        return results;
    }
}

Затем вы можете использовать его в своем код типа

var queryResult = await myTable.ExecuteQueryAllElementsAsync(query);
1 голос
/ 02 февраля 2020

Вы не можете. Вероятно, чтобы избежать длительного выполнения запроса.

Существуют и другие ограничения, которые вы можете прочитать здесь: https://docs.microsoft.com/en-us/rest/api/storageservices/Query-Timeout-and-Pagination?redirectedfrom=MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...