Partilhar via


Itens de consulta no Azure Cosmos DB para NoSQL usando .NET

APLICA-SE A: NoSQL

Os itens no Azure Cosmos DB representam entidades armazenadas em um contêiner. Na API para NoSQL, um item consiste em dados formatados em JSON com um identificador exclusivo. Quando você emite consultas usando a API para NoSQL, os resultados são retornados como uma matriz JSON de documentos JSON.

Itens de consulta usando SQL

O Azure Cosmos DB para NoSQL dá suporte ao uso de SQL (Structured Query Language) para executar consultas em itens em contêineres. Uma consulta SQL simples como SELECT * FROM products retornará todos os itens e propriedades de um contêiner. As consultas podem ser ainda mais complexas e incluir projeções de campo específicas, filtros e outras cláusulas SQL comuns:

SELECT 
    p.name, 
    p.description AS copy
FROM 
    products p 
WHERE 
    p.price > 500

Para saber mais sobre a sintaxe SQL do Azure Cosmos DB para NoSQL, consulte Introdução às consultas SQL.

Consultar um item

Nota

Os exemplos neste artigo pressupõem que você já definiu um tipo C# para representar seus dados chamado Product:

// C# record type for items in the container
public record Product(
    string id,
    string category,
    string name,
    int quantity,
    bool sale
);

Para consultar itens em um contêiner, chame um dos seguintes métodos:

Itens de consulta usando uma consulta SQL de forma assíncrona

Este exemplo cria uma consulta SQL usando uma cadeia de caracteres simples, recupera um iterador de feed e usa loops aninhados para iterar os resultados. O loop while externo iterará através das páginas de resultados, enquanto o loop foreach interno itera sobre os resultados dentro de uma página.

// 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}");
    }
}

O método Container.GetItemQueryIterator<> retorna um FeedIterator<> que é usado para iterar através de resultados de várias páginas. A HasMoreResults propriedade indica se ainda restam mais páginas de resultados. O ReadNextAsync método obtém a próxima página de resultados como um enumerável que é usado em um loop para iterar sobre os resultados.

Como alternativa, use o QueryDefinition para criar uma consulta SQL com entrada parametrizada:

// 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}");
    }
}

Gorjeta

Valores de entrada parametrizados podem ajudar a evitar muitos ataques comuns de injeção de consulta SQL.

Itens de consulta usando LINQ de forma assíncrona

Neste exemplo, um IQueryable<> objeto é usado para construir uma consulta integrada de linguagem (LINQ). Os resultados são então iterados usando um iterador de feed.

// 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}");
    }
}

O método Container.GetItemLinqQueryable<> constrói um IQueryable para criar a consulta LINQ. Em seguida, o ToFeedIterator<> método é usado para converter a expressão de consulta LINQ em um FeedIterator<>arquivo .

Gorjeta

Embora você possa iterar sobre o , esta operação é síncrona IQueryable<>. Use o ToFeedIterator<> método para coletar resultados de forma assíncrona.

Próximos passos

Agora que você consultou vários itens, experimente um de nossos tutoriais completos com a API para NoSQL.