Azureテーブルストレージのサンプルプログラム
以下のライブラリを使用します。
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Table;
以下のサンプルプログラムを作成しました。
- 接続文字列から作成したアカウントのテーブルを取得する。
- テーブルが存在していなければ作成する。
- 指定のテーブルに指定のエンティティを挿入する。
- 指定のテーブル内の指定の条件を満たすエンティティを検索する。
- 指定のテーブル内のすべてのエンティティを削除する。
接続文字列からクラウドストレージアカウントを作成し、そのアカウントのテーブルを取得するメソッド。ローカルでテストする場合は、接続文字列として "UseDevelopmentStorage=true" を指定し、ストレージのエミュレータ Azurite を使用します。
/// <summary> /// 指定の接続文字列から作成したクラウドストレージアカウントの /// 指定のテーブルへの参照を取得する。 /// </summary> /// <param name="connectionString"> /// クラウドストレージアカウントの作成に使用する接続文字列。 /// </param> /// <param name="tableName">参照を取得するテーブル名。</param> /// <returns>取得したテーブルへの参照を返す。</returns> private static CloudTable GetTableReference( string connectionString, string tableName) { CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); CloudTable table = tableClient.GetTableReference(tableName); return table; }
テーブルが存在していなければ作成するメソッド。
/// <summary> /// 指定のテーブル参照にテーブルが存在していなければ非同期で作成する。 /// </summary> /// <param name="table">テーブルを作成するテーブル参照。</param> private static async Task CreateTableIfNotExistsAsync(CloudTable table) { await table.CreateIfNotExistsAsync(); }
指定のテーブルに指定のエンティティを挿入するメソッド。
/// <summary> /// 指定のテーブルに指定のエンティティを非同期で挿入する。 /// </summary> /// <param name="table">指定のエンティティを挿入するテーブル。</param> /// <param name="entity">指定のテーブルに挿入するエンティティ。</param> private static async Task InsertEntityAsync( CloudTable table, ITableEntity entity) { TableOperation insertOp = TableOperation.Insert(entity); await table.ExecuteAsync(insertOp); }
指定のテーブル内の指定の条件を満たすエンティティを検索するメソッド。
/// <summary> /// 指定のテーブル内の指定の条件を満たすエンティティを非同期で検索する。 /// </summary> /// <typeparam name="T"> /// テーブル内のエンティティの型。<see cref="ITableEntity"/>を実装し、 /// publicで引数のないコンストラクタが必要。 /// </typeparam> /// <param name="table">検索するエンティティを格納するテーブル。</param> /// <param name="query">エンティティを検索する条件。</param> /// <returns>テーブル内の条件を満たすエンティティのリストを返す。</returns> private static async Task<List<T>> QueryEntitiesAsync<T>( CloudTable table, TableQuery<T> query) where T: ITableEntity, new() { List<T> entities = new(); TableContinuationToken? continuationToken = null; do { TableQuerySegment<T> querySegment = await table.ExecuteQuerySegmentedAsync<T>(query, continuationToken); entities.AddRange(querySegment.Results); continuationToken = querySegment.ContinuationToken; } while (continuationToken != null); return entities; }
条件はこんなふうに作成する。次の例は、エンティティ内のプロパティ "RowKey" の
整数としての値が 1,000 未満の場合。
TableQuery<TableEntity> query = new TableQuery<TableEntity>() .Where(TableQuery.GenerateFilterConditionForInt( "RowKey", QueryComparisons.LessThan, 1000));
指定のテーブル内のすべてのエンティティをで削除するメソッド。
/// <summary> /// 指定のテーブル内のすべてのエンティティを非同期で削除する。 /// </summary> /// <typeparam name="T"> /// テーブル内のエンティティの型。<see cref="ITableEntity"/>を実装し、 /// publicで引数のないコンストラクタが必要。 /// </typeparam> /// <param name="table">削除するエンティティを格納するテーブル。</param> private static async Task DeleteAllEntitiesAsync<T>(CloudTable table) where T: ITableEntity, new() { TableQuery<T> query = new(); TableContinuationToken? continuationToken = null; do { TableQuerySegment<T> querySegment = await table.ExecuteQuerySegmentedAsync<T>(query, continuationToken); foreach (ITableEntity entity in querySegment.Results) { TableOperation deleteOp = TableOperation.Delete(entity); await table.ExecuteAsync(deleteOp); } continuationToken = querySegment.ContinuationToken; } while (continuationToken != null); }