Подтвердить что ты не робот

Как запросить все строки в окнах azure table storage?

Я пытаюсь получить список всех объектов внутри моей лазурной таблицы.

Любая идея, как я буду писать этот запрос?

Я использую С# btw. Спасибо.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос, вы можете сделать что-то вроде следующего:

var acc = new CloudStorageAccount(
                         new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
var entities = table.ExecuteQuery(new TableQuery<MyEntity>()).ToList();

Однако имейте в виду, что табличный сервис возвращает максимум 1000 объектов за один вызов. Если в вашей таблице доступно более 1000 сущностей, она возвращает continuation token который можно использовать для получения следующего набора сущностей. Метод ExecuteQuery фактически обрабатывает этот токен продолжения внутренне, поэтому, если вы хотите отменить эту операцию по какой-либо причине, вы не можете этого сделать.

Лучшим подходом было бы использовать метод ExecuteQuerySegmented и заставить ваше приложение иметь дело с токеном. Вот пример кода для этого:

var acc = new CloudStorageAccount(
                         new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
TableContinuationToken token = null;
var entities = new List<MyEntity>();
do
{
    var queryResult = table.ExecuteQuerySegmented(new TableQuery<MyEntity>(), token);
    entities.AddRange(queryResult.Results);
    token = queryResult.ContinuationToken;
} while (token != null);

Ответ 2

Возможно, более эффективный способ ленивого извлечения элементов из таблицы:

    public IEnumerable<T> GetAll<T>(string tableName) where T : class
    {
        var table = this.GetCloudTable(tableName);
        TableContinuationToken token = null;
        do
        {
            var q = new TableQuery<T>();
            var queryResult = Task.Run(() => table.ExecuteQuerySegmentedAsync(q, token)).GetAwaiter().GetResult();
            foreach (var item in queryResult.Results)
            {
                yield return item;
            }
            token = queryResult.ContinuationToken;
        } while (token != null);
    }

Если вызывающая GetAll результат GetAll и находит то, что искала, она может просто break цикл, и метод GetAll прекратит получение следующих элементов. Это может быть более эффективным, хотя это не будет иметь большого значения, если вам действительно придется извлечь все элементы.


Если вы используете С# 8.0, вы можете получить внутри асинхронных методов:

    public async Task<IEnumerable<T>> GetAll<T>(string tableName) where T : class
    {
        var table = this.GetCloudTable(tableName);
        TableContinuationToken token = null;
        do
        {
            var q = new TableQuery<T>();
            var queryResult = await table.ExecuteQuerySegmentedAsync(q, token);
            foreach (var item in queryResult.Results)
            {
                yield return item;
            }
            token = queryResult.ContinuationToken;
        } while (token != null);
    }