Consulta de elementos en Azure Cosmos DB for NoSQL con .NET

SE APLICA A: NoSQL

Los elementos de Azure Cosmos DB representan entidades almacenadas dentro de un contenedor. En la API para NoSQL, un elemento consta de datos con formato JSON con un identificador único. Cuando emite consultas mediante la API para NoSQL, los resultados se devuelven como una matriz JSON de documentos JSON.

Consulta de elementos mediante SQL

Azure Cosmos DB for NoSQL admite el uso del Lenguaje de consulta estructurado (SQL) para realizar consultas en elementos de contenedores. Una consulta SQL simple como SELECT * FROM products devolverá todos los elementos y propiedades de un contenedor. Las consultas pueden ser aún más complejas e incluir proyecciones de campos específicos, filtros y otras cláusulas comunes de SQL:

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

Para más información sobre la sintaxis de SQL para Azure Cosmos DB for NoSQL, consulte Introducción a las consultas SQL.

Consulta de un elemento

Nota:

En los ejemplos de este artículo, se da por supuesto que ya ha definido un tipo de C# para representar los datos llamado Product:

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

Para consultar los elementos de un contenedor, llame a uno de los métodos siguientes:

Consulta de elementos mediante una consulta SQL de forma asincrónica

En este ejemplo, se crea una consulta SQL mediante una cadena simple, se recupera un iterador de fuente y, a continuación, se usan bucles anidados para recorrer en iteración los resultados. El bucle while externo recorrerá en iteración las páginas de resultados, mientras que el bucle foreach interno recorre en iteración los resultados dentro de una página.

// Query multiple items from container
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
    queryText: "SELECT * FROM products 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}");
    }
}

El método Container.GetItemQueryIterator<> devuelve un elemento FeedIterator<> que se usa para recorrer en iteración los resultados de varias páginas. La propiedad HasMoreResults indica si quedan más páginas de resultados. El método ReadNextAsync obtiene la siguiente página de resultados como un elemento enumerable que se usa después en un bucle para recorrer en iteración los resultados.

Como alternativa, use QueryDefinition para crear una consulta SQL con 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}");
    }
}

Sugerencia

Los valores de entrada parametrizada pueden ayudar a evitar muchos ataques comunes por inyección de consultas SQL.

Consulta de elementos mediante LINQ de forma asincrónica

En este ejemplo, se usa un objeto IQueryable<> para construir una consulta integrada de lenguaje (LINQ). A continuación, los resultados se recorren en iteración con un iterador de fuente.

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

El método Container.GetItemLinqQueryable<> crea un elemento IQueryable para crear la consulta LINQ. A continuación, se usa el método ToFeedIterator<> para convertir la expresión de consulta LINQ en un elemento FeedIterator<>.

Sugerencia

Aunque puede recorrer en iteración el elemento IQueryable<>, esta operación es sincrónica. Use el método ToFeedIterator<> para recopilar los resultados de forma asincrónica.

Pasos siguientes

Ahora que ha consultado varios elementos, pruebe uno de nuestros tutoriales integrales con la API de NoSQL.