ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

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

2021/6/20

→ C# のサンプルに切り替える

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

Azure Cosmos DB Table API の概要 | Microsoft Docs

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

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

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

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

'▼結果
'取得したエンティティを出力します。
For Each entity As DynamicTableEntity In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.Properties("area")}")
    Debug.WriteLine($"{vbTab}population = {entity.Properties("population")}")
Next

Debug.WriteLineが表示される場所

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

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

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

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

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

'▼結果
'取得したエンティティを出力します。
For Each entity As Prefecture In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.area}")
    Debug.WriteLine($"{vbTab}population = {entity.population}")
Next

Debug.WriteLineが表示される場所

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

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

Prefecture クラス

Public Class Prefecture
    Inherits TableEntity 
    
    <Microsoft.Azure.Cosmos.Table.IgnoreProperty>
    Public Property name As String
        Get
            Return RowKey
        End Get
        Set(value As String)
            RowKey = value
        End Set
    End Property

    Public Property population As Integer
    Public Property area As String
End Class

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

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

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

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

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

'▼結果
'取得したエンティティを出力します。
For Each entity As DynamicTableEntity In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.Properties("area")}")
    Debug.WriteLine($"{vbTab}population = {entity.Properties("population")}")
Next

Debug.WriteLineが表示される場所

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

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

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

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

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

'▼結果
'取得したエンティティを出力します。
For Each entity As Prefecture In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.area}")
    Debug.WriteLine($"{vbTab}population = {entity.population}")
Next

Debug.WriteLineが表示される場所

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

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

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

'▼検索条件の作成
Dim query As 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 '関東')"

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

'▼結果
'取得したエンティティを出力します。
For Each entity As DynamicTableEntity In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.Properties("area")}")
    Debug.WriteLine($"{vbTab}population = {entity.Properties("population")}")
Next

Debug.WriteLineが表示される場所

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

 

 

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

'▼検索条件の作成
Dim query As 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 '近畿'))"

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

'▼結果
'取得したエンティティを出力します。
For Each entity As DynamicTableEntity In results
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.Properties("area")}")
    Debug.WriteLine($"{vbTab}population = {entity.Properties("population")}")
Next

Debug.WriteLineが表示される場所

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

 

 

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

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

前提

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

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

VB2015対応 VB2017対応 VB2019対応

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

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

'▼追加操作を実行
Dim insert = Function (name As String, area As String, population As Integer)
                 Return TableOperation.Insert(New Prefecture() With
                 {
                     .PartitionKey = "1",
                     .RowKey = name,
                     .area = area,
                     .population = population
                 })
             End Function

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. というエラーが発生します。

VB2015対応 VB2017対応 VB2019対応

'▼検索条件の作成
Dim query = From p In table.CreateQuery(Of Prefecture) Where p.name.Contains("山")

'▼結果
'取得したエンティティを出力します。
For Each entity As Prefecture In query
    'ParitionKey と RowKey は必ず存在します。
    Debug.WriteLine($"{entity.PartitionKey} {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"{vbTab}area = {entity.area}")
    Debug.WriteLine($"{vbTab}population = {entity.population}")
Next

参考: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

 


VB6対応 VB6では XMLHttpRequestの機能でREST APIを呼び出すことで、同じことを実現できるかもしれません。