ヘッダー
C# サンプル集
 

テーブルAPI でエンティティを検索する

2021/6/20

→ Visual Basic のサンプルに切り替える

この記事は Azure Cosmos DB テーブル API を対象にしています。

Azure Cosmos DB Table API の概要 | Microsoft Docs

 

 

area == "九州" のエンティティをすべて取得する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery query = new TableQuery();
// area == "九州" のエンティティを検索するように条件を設定します。
query.Where(TableQuery.GenerateFilterCondition("area", QueryComparisons.Equal, "九州"));

//これでもOK
//query.FilterString = "area eq '九州'";

//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (DynamicTableEntity entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.Properties["area"]}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.Properties["population"]}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

 

 

area == "九州" のエンティティをすべて取得し、クラスにマッピングする

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery<Prefecture> query = new TableQuery<Prefecture>();
// area == "九州" のエンティティを検索するように条件を設定します。
query.Where(TableQuery.GenerateFilterCondition("area", QueryComparisons.Equal, "九州"));

//これでもOK
//query.FilterString = "area eq '九州'";

//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (Prefecture entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.area}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.population}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

この例で使用している Prefectureクラス の定義は次の通りです。

Prefecture クラス

public class Prefecture : TableEntity
{ 
    [Microsoft.Azure.Cosmos.Table.IgnoreProperty]
    public string name { get => RowKey; set => RowKey = value; }
    public int population { get; set; }
    public string area { get; set; }
}

メモ:エンティティは TableEntity を継承するのが楽です。この例ではキー項目にIgnoreProperty属性をつけて name と RowKey をマッピングしています。その代わりにRowKeyプロパティを直接使用する方法もあります。

 

 

population >= 2000000 のエンティティをすべて取得する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery query = new TableQuery();
// population >= 2000000 のエンティティを検索するように条件を設定します。
query.Where(TableQuery.GenerateFilterConditionForInt("population", QueryComparisons.GreaterThanOrEqual, 2000000));

//これでもOK
//query.FilterString = "population ge 2000000";

//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (DynamicTableEntity entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.Properties["area"]}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.Properties["population"]}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

 

 

population >= 2000000 のエンティティをすべて取得し、クラスにマッピングする

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery<Prefecture> query = new TableQuery<Prefecture>();
// population >= 2000000 のエンティティを検索するように条件を設定します。
query.Where(TableQuery.GenerateFilterConditionForInt("population", QueryComparisons.GreaterThanOrEqual, 2000000));

//これでもOK
//query.FilterString = "population ge 2000000";

//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (Prefecture entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.area}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.population}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

メモ:この例で使用している Prefecture クラス は 上述の例 と同じです。

 

 

population >= 2000000 で area != "関東" のエンティティをすべて取得する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery query = new TableQuery();
// population >= 2000000 で area != "関東" のエンティティを検索するように条件を設定します。
query.Where(TableQuery.CombineFilters(
    TableQuery.GenerateFilterConditionForInt("population", QueryComparisons.GreaterThanOrEqual, 2000000),
    TableOperators.And,
    TableQuery.GenerateFilterCondition("area", QueryComparisons.NotEqual, "関東")
));

//これでもOK
//query.FilterString = "(population ge 2000000) and (area ne '関東')";

//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (DynamicTableEntity entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.Properties["area"]}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.Properties["population"]}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

 

 

population < 1000000 で area == "九州" または area == "近畿" のエンティティをすべて取得する

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼検索条件の作成
TableQuery query = new TableQuery();
// population < 1000000 で area == "九州" または area == "近畿" のエンティティを検索するように条件を設定します。
query.Where(TableQuery.CombineFilters(
    TableQuery.GenerateFilterConditionForInt("population", QueryComparisons.LessThan, 1000000),
    TableOperators.And,
    TableQuery.CombineFilters(
        TableQuery.GenerateFilterCondition("area", QueryComparisons.Equal, "九州"),
        TableOperators.Or,
        TableQuery.GenerateFilterCondition("area", QueryComparisons.Equal, "近畿")
    )
));

//これでもOK
//query.FilterString = "(population lt 1000000) and ((area eq '九州') or (area eq '近畿'))";


//▼検索を実行して結果を取得
var results = table.ExecuteQuery(query);

//▼結果
//取得したエンティティを出力します。
foreach (DynamicTableEntity entity in results)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.Properties["area"]}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.Properties["population"]}");
}

Debug.WriteLineが表示される場所

メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。

 

 

参考:サンプルデータの設定方法

下記のプログラムで、サンプルデータを登録できます。

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • using Microsoft.Azure.Cosmos.Table; がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

//▼テーブルへの参照を取得
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("TestTable");

//▼追加操作を実行
Func<string, string, int, TableOperation> insert =
    (string name, string area, int population) =>
    {
        return TableOperation.Insert(new Prefecture()
        {
            PartitionKey = "1",
            RowKey = name,
            area = area,
            population = population
        });
    };

table.Execute(insert("北海道", "北海道", 5383579));
table.Execute(insert("青森県", "東北", 1308649));
table.Execute(insert("岩手県", "東北", 1279814));
table.Execute(insert("宮城県", "東北", 2334215));
table.Execute(insert("秋田県", "東北", 1022839));
table.Execute(insert("山形県", "東北", 1122957));
table.Execute(insert("福島県", "東北", 1913606));
table.Execute(insert("茨城県", "関東", 2917857));
table.Execute(insert("栃木県", "関東", 1974671));
table.Execute(insert("群馬県", "関東", 1973476));

table.Execute(insert("埼玉県", "関東", 7261271));
table.Execute(insert("千葉県", "関東", 6224027));
table.Execute(insert("東京都", "関東", 13513734));
table.Execute(insert("神奈川県", "関東", 9127323));
table.Execute(insert("新潟県", "中部", 2305098));
table.Execute(insert("富山県", "中部", 1066883));
table.Execute(insert("石川県", "中部", 1154343));
table.Execute(insert("福井県", "中部", 787099));
table.Execute(insert("山梨県", "中部", 835165));
table.Execute(insert("長野県", "中部", 2099759));

table.Execute(insert("岐阜県", "中部", 2032533));
table.Execute(insert("静岡県", "中部", 3701181));
table.Execute(insert("愛知県", "中部", 7484094));
table.Execute(insert("三重県", "近畿", 1815827));
table.Execute(insert("滋賀県", "近畿", 1413184));
table.Execute(insert("京都府", "近畿", 2610140));
table.Execute(insert("大阪府", "近畿", 8838908));
table.Execute(insert("兵庫県", "近畿", 5536989));
table.Execute(insert("奈良県", "近畿", 1365008));
table.Execute(insert("和歌山県", "近畿", 963850));

table.Execute(insert("鳥取県", "中国", 573648));
table.Execute(insert("島根県", "中国", 694188));
table.Execute(insert("岡山県", "中国", 1922181));
table.Execute(insert("広島県", "中国", 2844963));
table.Execute(insert("山口県", "中国", 1405007));
table.Execute(insert("徳島県", "四国", 756063));
table.Execute(insert("香川県", "四国", 976756));
table.Execute(insert("愛媛県", "四国", 1385840));
table.Execute(insert("高知県", "四国", 728461));
table.Execute(insert("福岡県", "九州", 5102871));

table.Execute(insert("佐賀県", "九州", 833245));
table.Execute(insert("長崎県", "九州", 1377780));
table.Execute(insert("熊本県", "九州", 1786969));
table.Execute(insert("大分県", "九州", 1166729));
table.Execute(insert("宮崎県", "九州", 1104377));
table.Execute(insert("鹿児島県", "九州", 1648752));
table.Execute(insert("沖縄県", "沖縄", 1434138));

メモ:このプログラムで使用している Prefecture クラス は 上述の例 と同じです。

 

 

参考:LINQ

LINQを使ってクエリする方法あるようですが、次の例ではエラーになりました。 サポートされている操作がわかりやすく記載されているドキュメントを見つけないと使いにくいように思います。

また、どこまでをクラウド上で実行するのかも明確にしないと大量のデータをダウンロードしてメモリ内でクエリすることになると思いますから、その点も心配です。

次の例を実行すると、FilterString は substringof("山",entity['name']['$v']) となり、'substringof' is not a recognized built-in function name. というエラーが発生します。

//▼検索条件の作成
IQueryable<Prefecture> query = table.CreateQuery<Prefecture>()
.Where(p => p.name.Contains("山"))
.Select(p => p);

//▼結果
//取得したエンティティを出力します。
foreach (Prefecture entity in query)
{
    //ParitionKey と RowKey は必ず存在します。
    System.Diagnostics.Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}");
    //ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    System.Diagnostics.Debug.WriteLine($"\tarea = {entity.area}");
    System.Diagnostics.Debug.WriteLine($"\tpopulation = {entity.population}");
}

参考:Azure Cosmos DB でテーブル データのクエリを実行する方法 | Microsoft Docs

 

 

参考:Webサイト

.NET Standard SDK を使用した Azure Cosmos DB Table API | Microsoft Docs

クイック スタート:.NET での Table API の使用 - Azure Cosmos DB | Microsoft Docs

テーブルとエンティティのクエリ (REST API)-Azure Storage | Microsoft Docs