Visual Basic サンプル集 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 > Azure > Cosmos DB
テーブルAPI でエンティティを検索する
2021/6/20
この記事は Azure Cosmos DB テーブル API を対象にしています。
目次
- area = "九州" のエンティティをすべて取得する
- area = "九州" のエンティティをすべて取得し、クラスにマッピングする
- population >= 2000000 のエンティティをすべて取得する
- population >= 2000000 のエンティティをすべて取得し、クラスにマッピングする
- population >= 2000000 で area <> "関東" のエンティティをすべて取得する
- population < 1000000 で area = "九州" または area = "近畿" のエンティティをすべて取得する
- 参考:サンプルデータの設定方法
- 参考:LINQ
- 参考:Webサイト
area = "九州" のエンティティをすべて取得する
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
area = "九州" のエンティティをすべて取得し、クラスにマッピングする
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
この例で使用している 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 がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
population >= 2000000 のエンティティをすべて取得し、クラスにマッピングする
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
メモ:この例で使用している Prefecture クラス は 上述の例 と同じです。
population >= 2000000 で area <> "関東" のエンティティをすべて取得する
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
population < 1000000 で area = "九州" または area = "近畿" のエンティティをすべて取得する
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例を試すためのサンプルデータの設定方法を参考で紹介しています。
参考:サンプルデータの設定方法
下記のプログラムで、サンプルデータを登録できます。
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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. というエラーが発生します。
'▼検索条件の作成
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
参考:Webサイト
.NET Standard SDK を使用した Azure Cosmos DB Table API | Microsoft Docs
クイック スタート:.NET での Table API の使用 - Azure Cosmos DB | Microsoft Docs
VB6では
XMLHttpRequestの機能でREST APIを呼び出すことで、同じことを実現できるかもしれません。