.NET を使用して Azure Cosmos DB for NoSQL の項目のクエリを実行する
適用対象: NoSQL
Azure Cosmos DB 内の項目は、コンテナー内に格納されているエンティティを表します。 NoSQL 用 API では、項目は一意の識別子を含む JSON 形式のデータから成ります。 NoSQL 用 API を使用してクエリを発行すると、JSON ドキュメントの JSON 配列として結果が返されます。
SQL を使用して項目のクエリを実行する
Azure Cosmos DB for NoSQL では、構造化照会言語 (SQL) を使用してコンテナー内の項目に対してクエリを実行できます。 SELECT * FROM products
などの単純な SQL クエリは、コンテナーからすべての項目とプロパティを返します。 クエリは、さらに複雑にして、特定のフィールド プロジェクション、フィルター、およびその他の一般的な SQL 句を含めることができます。
SELECT
p.name,
p.description AS copy
FROM
products p
WHERE
p.price > 500
Azure Cosmos DB for NoSQL の SQL 構文の詳細については、「SQL クエリの使用を開始する」を参照してください。
項目にクエリを実行する
注意
この記事の例は、Product という名前のデータを表すために C# 型が既に定義されていることを前提としています。
// C# record type for items in the container
public record Product(
string id,
string category,
string name,
int quantity,
bool sale
);
コンテナー内の項目に対してクエリを実行するには、次のいずれかのメソッドを呼び出します。
SQL クエリを使用して項目のクエリを非同期的に実行する
この例では、単純な文字列を使用して SQL クエリを作成し、フィード反復子を取得してから、入れ子になったループを使用して結果を反復処理します。 外側の while ループは結果ページを反復処理し、内側の foreach ループはページ内の結果を反復処理します。
// Query multiple items from container
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
queryText: "SELECT * FROM products p WHERE p.quantity > 10"
);
// Iterate query result pages
while (feed.HasMoreResults)
{
FeedResponse<Product> response = await feed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Found item:\t{item.name}");
}
}
Container.GetItemQueryIterator<> メソッドにより、複数ページの結果を反復処理するために使用する FeedIterator<>
が返されます。 HasMoreResults
プロパティは、それ以上の結果ページが残っているかどうかを示します。 ReadNextAsync
メソッドにより、結果の次のページが列挙可能として取得され、ループで結果を反復処理するために使用されます。
または、QueryDefinition を使用して、パラメーター化された入力を使用して SQL クエリを作成します。
// Build query definition
var parameterizedQuery = new QueryDefinition(
query: "SELECT * FROM products p WHERE p.quantity > @quantity"
)
.WithParameter("@quantity", 10);
// Query multiple items from container
using FeedIterator<Product> filteredFeed = container.GetItemQueryIterator<Product>(
queryDefinition: parameterizedQuery
);
// Iterate query result pages
while (filteredFeed.HasMoreResults)
{
FeedResponse<Product> response = await filteredFeed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Found item:\t{item.name}");
}
}
ヒント
パラメーター化された入力値は、多くの一般的な SQL クエリ インジェクション攻撃を防ぐのに役立ちます。
LINQ を使用して項目のクエリを非同期的に実行する
この例では、IQueryable
<> オブジェクトを使用して、言語統合クエリ (LINQ) を作成します。 その後、結果がフィード反復子を使用して反復処理されます。
// Get LINQ IQueryable object
IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
// Construct LINQ query
var matches = queryable
.Where(p => p.quantity > 10);
// Convert to feed iterator
using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
// Iterate query result pages
while (linqFeed.HasMoreResults)
{
FeedResponse<Product> response = await linqFeed.ReadNextAsync();
// Iterate query results
foreach (Product item in response)
{
Console.WriteLine($"Matched item:\t{item.name}");
}
}
Container.GetItemLinqQueryable<> メソッドにより、LINQ クエリを作成する IQueryable
が作成されます。 その後、ToFeedIterator<>
メソッドを使用して LINQ クエリ式を FeedIterator<>
に変換します。
ヒント
IQueryable<>
を反復処理する間、この操作は同期的です。 非同期的に結果を収集するには、ToFeedIterator<>
メソッドを使用してください。
次のステップ
複数の項目に対してクエリを実行したので、NoSQL 用 API を使用したエンド ツー エンドのチュートリアルのいずれかを試してみます。