web-dev-qa-db-ja.com

Windows Azureテーブルストレージのすべての行をクエリする方法は?

Azureテーブル内のすべてのエンティティのリストを取得しようとしています。

このクエリをどのように書きますか?

私はc#btwを使用しています。ありがとう。

40
SKLAK

あなたの質問に答えるには、次のようなことができます:

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

ただし、テーブルサービスは1回の呼び出しで最大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);
80
Gaurav Mantri

より効率的にテーブルからアイテムを取得するより効率的な方法は次のとおりです。

    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するだけで、GetAllメソッドは次の項目の取得を停止します。これはより効率的かもしれませんが、本当にすべてのアイテムを取得しなければならない場合、これは大きな違いをもたらさないでしょう。


C#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);
    }
0
Alisson