ヘッダー
C# サンプル集
 

SQL API でアイテムをSQLでクエリする

2021/7/4

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

この記事は Azure Cosmos DB SQL API を対象にしています。

クイックスタート - Azure Cosmos DB SQL API リソースを管理する .NET コンソール アプリを構築する | Microsoft Docs

  • この記事の内容は Microsoft.Azure.Cosmos パッケージ バージョン 3.19.0 で確認しています。
  • この記事の内容は 容量モード サーバーレス で確認しています。(記事執筆時点ではプレビュー機能です。)

 

 

Name = "徳川家康" のアイテムをすべて取得して、クラスにマッピングする

この例では、name = "徳川家康" に合致するすべてのアイテムを Person クラスにマッピングして取得します。Personクラスの定義は後述します。

前提

  • Azure Cosmos DB のコア(SQL)のアカウントに、MySampleDBデータベースとMySampleContainerコンテナがある。
  • NuGet で Microsoft.Azure.Cosmos パッケージをインストールしている。→ NuGetの使用方法
  • using Microsoft.Azure.Cosmos; がソースコードの冒頭付近に記載されている。

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

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "AccountEndpoint=https://mycosmosaccount.azure.com:443/;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;";
CosmosClient cosmosClient = new CosmosClient(connectionString);

//▼コンテナへの参照を取得
Database database = cosmosClient.GetDatabase("MySampleDB");
Container container = database.GetContainer("MySampleContainer");

//▼クエリを実行して Name = '徳川家康' のアイテムをすべて取得
string sql = "SELECT * FROM c WHERE c.Name = '徳川家康'";
QueryDefinition query = new QueryDefinition(sql);
var itor = container.GetItemQueryIterator<Person>(query);

//▼結果
while (itor.HasMoreResults)
{
    var results = itor.ReadNextAsync().GetAwaiter().GetResult();

    foreach (Person p in results)
    {
        System.Diagnostics.Debug.WriteLine($"{p.id} {p.Name} {p.Age}");
    }
}

Debug.WriteLineが表示される場所

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

Person クラス

public class Person
{
    //id は必須プロパティです。
    public string id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

 

 

Name = "徳川家康" のアイテムをすべてJSON形式で取得する

この例では、name = "徳川家康" に合致するすべてのアイテムをJSON形式で取得します。マッピング用のクラスは不要です。

前提

  • Azure Cosmos DB のコア(SQL)のアカウントに、MySampleDBデータベースとMySampleContainerコンテナがある。
  • NuGet で Microsoft.Azure.Cosmos パッケージをインストールしている。→ NuGetの使用方法
  • using Microsoft.Azure.Cosmos; がソースコードの冒頭付近に記載されている。
  • .NET Frameworkを使用する場合、NuGet で System.Text.Json をインストールしている。

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

//▼Cosmos DBに接続
//接続文字列は環境に応じて指定してください。
string connectionString = "AccountEndpoint=https://mycosmosaccount.azure.com:443/;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;";
CosmosClient cosmosClient = new CosmosClient(connectionString);

//▼コンテナへの参照を取得
Database database = cosmosClient.GetDatabase("MySampleDB");
Container container = database.GetContainer("MySampleContainer");

//▼クエリを実行して Name = '徳川家康' のアイテムをすべて取得
string sql = "SELECT * FROM c WHERE c.Name = '徳川家康'";
var itor = container.GetItemQueryStreamIterator(sql);

//▼結果
while (itor.HasMoreResults)
{
    var results = itor.ReadNextAsync().GetAwaiter().GetResult();

    using System.IO.StreamReader reader = new System.IO.StreamReader(results.Content);
    {
        //結果は JSON で取得できます。このJSONにはメタ情報も含まれています。
        string jsonText = reader.ReadToEnd();

        //System.Text.Jsonを使ってJSONの構造にアクセスします。
        using (var document = System.Text.Json.JsonDocument.Parse(jsonText))
        {
            //アイテムは Documents という名前のJSON配列に入っています。
            var items = document.RootElement.GetProperty("Documents");

            //アイテムのJSON配列を列挙して、アイテムの値を取り出します。
            foreach(var person in items.EnumerateArray())
            {
                string id = person.GetProperty("id").GetString();
                string Name = person.GetProperty("Name").GetString();
                int Age = person.GetProperty("Age").GetInt32();

                System.Diagnostics.Debug.WriteLine($"{id} {Name} {Age}");
            } //foreach 
        } //using document
    } //using reader
} //while itor

Debug.WriteLineが表示される場所