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

Как выполнить асинхронный запрос хранилища таблиц Azure? версия клиента 4.0.1

Хотите выполнить запросы Async в Azure Storage Client версии 4.0.1

Нет метода ExecuteQueryAsync()..

Я что-то упустил? Должны ли мы продолжать использовать ExecuteQuerySegmentedAsync? Спасибо.

4b9b3361

Ответ 1

В результате я создаю метод расширения для использования ExecuteQuerySegmentedAsync. Я не уверен, является ли это решение оптимальным, если у кого-нибудь есть какие-либо комментарии, пожалуйста, не стесняйтесь.

public static async Task<IList<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query, CancellationToken ct = default(CancellationToken), Action<IList<T>> onProgress = null) where T : ITableEntity, new()
    {

        var items = new List<T>();
        TableContinuationToken token = null;

        do
        {

            TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync<T>(query, token);
            token = seg.ContinuationToken;
            items.AddRange(seg);
            if (onProgress != null) onProgress(items);

        } while (token != null && !ct.IsCancellationRequested);

        return items;
    }

Ответ 2

Когда запрос таблицы содержит условие take, указанное решение возвращает больше элементов, чем запрошено по запросу. Небольшое изменение выражения while решит эту проблему.

public static async Task<IList<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query, CancellationToken ct = default(CancellationToken), Action<IList<T>> onProgress = null) where T : ITableEntity, new()
{
    var runningQuery = new TableQuery<T>()
    {
        FilterString = query.FilterString,
        SelectColumns = query.SelectColumns
    };

    var items = new List<T>();
    TableContinuationToken token = null;

    do
    {
        runningQuery.TakeCount = query.TakeCount - items.Count;

        TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync<T>(runningQuery, token);
        token = seg.ContinuationToken;
        items.AddRange(seg);
        if (onProgress != null) onProgress(items);

    } while (token != null && !ct.IsCancellationRequested && (query.TakeCount == null || items.Count < query.TakeCount.Value));

    return items;
}

EDITED. Благодаря предложению PaulG, исправлена ​​проблема с результатом, когда запрос содержит предложение take, а ExecuteQuerySegmentedAsync возвращает элементы в несколько проходов.