IT TIP

Azure 테이블 스토리지 쿼리 비동기를 실행하는 방법은 무엇입니까?

itqueen 2020. 12. 30. 19:57
반응형

Azure 테이블 스토리지 쿼리 비동기를 실행하는 방법은 무엇입니까? 클라이언트 버전 4.0.1


Azure Storage 클라이언트 버전 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;
}

수정 됨 : PaulG의 제안 덕분에 쿼리에 take 절이 포함되어 ExecuteQuerySegmentedAsync있고 여러 단계에서 항목을 반환 할 때 결과 개수 문제가 수정되었습니다 .


이것은 @JoseCh.의 답변 에 추가됩니다 .

다음은 EntityResolver를 지정할 수있는 확장 메서드입니다.

public static async Task<IList<TResult>> ExecuteQueryAsync<T, TResult>(this CloudTable table, TableQuery query, EntityResolver<TResult> resolver, Action<IList<TResult>> onProgress = null, CancellationToken cancelToken = default(CancellationToken))
            where T : ITableEntity, new()
{
    var items = new List<TResult>();
    TableContinuationToken token = null;

    do
    {
        TableQuerySegment<TResult> seg = await table.ExecuteQuerySegmentedAsync(query: query, resolver: resolver, token: new TableContinuationToken(), cancellationToken: cancelToken).ConfigureAwait(false);
        token = seg.ContinuationToken;
        items.AddRange(seg);
        onProgress?.Invoke(items);
     }
     while (token != null && !cancelToken.IsCancellationRequested);
         return items;
     }
}

스토리지에있는 단일 열의 결과 집합 만 반환하려는 경우에만 사용할 수 있습니다.

// maps to a column name in storage
string propertyName = nameof(example.Category);

// Define the query, and select only the Category property.
var projectionQuery = new TableQuery().Select(new string[] { propertyName });

// Define an entity resolver to work with the entity after retrieval.
EntityResolver<string> resolver = (pk, rk, ts, props, etag) => props.ContainsKey(propertyName) ? props[propertyName].StringValue : null;

var categories = (await someTable.ExecuteQueryAsync<DynamicTableEntity, string>(query: projectionQuery, resolver: resolver).ConfigureAwait(false)).ToList()

참조 URL : https://stackoverflow.com/questions/24234350/how-to-execute-an-azure-table-storage-query-async-client-version-4-0-1

반응형