Хотите выполнить запросы Async в Azure Storage Client версии 4.0.1
Нет метода ExecuteQueryAsync()..
Я что-то упустил? Должны ли мы продолжать использовать ExecuteQuerySegmentedAsync? Спасибо.
Хотите выполнить запросы Async в Azure Storage Client версии 4.0.1
Нет метода ExecuteQueryAsync()..
Я что-то упустил? Должны ли мы продолжать использовать ExecuteQuerySegmentedAsync? Спасибо.
В результате я создаю метод расширения для использования 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;
}
Когда запрос таблицы содержит условие 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
возвращает элементы в несколько проходов.