>

zure 테이블 내부의 모든 엔티티 목록을 가져 오려고합니다.

이 쿼리를 작성하는 방법에 대한 아이디어가 있습니까?

c # btw를 사용하고 있습니다. 감사합니다.


  • 답변 # 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
    
    

  • 답변 # 2

    테이블에서 항목을 느리게 검색하는보다 효율적인 방법은 다음과 같습니다.

    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);
    
    

    발신자가 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 할 수 있습니다.  루프와 break  메소드는 다음 항목 검색을 중지합니다. 모든 항목을 실제로 검색해야하더라도 큰 차이는 없지만 더 효율적일 수 있습니다.

    <시간>

    C # 8.0을 사용하는 경우 비동기 메소드 내에서 생성 할 수 있습니다 :

    GetAll
    
    
    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); }

관련 자료

  • 이전 python - 연속 문자열에서 정규식 일치 만 선택
  • 다음 jquery - JavaScript를 사용하여 스톱워치를 만드는 방법은 무엇입니까?