Query-items uitvoeren in Azure Cosmos DB voor NoSQL met behulp van .NET

VAN TOEPASSING OP: NoSQL

Items in Azure Cosmos DB vertegenwoordigen entiteiten die zijn opgeslagen in een container. In de API voor NoSQL bestaat een item uit gegevens in JSON-indeling met een unieke id. Wanneer u query's opvraagt met behulp van de API voor NoSQL, worden de resultaten geretourneerd als een JSON-matrix met JSON-documenten.

Query's uitvoeren op items met behulp van SQL

Azure Cosmos DB for NoSQL ondersteunt het gebruik van Structured Query Language (SQL) om query's uit te voeren op items in containers. Een eenvoudige SQL-query zoals SELECT * FROM products retourneert alle items en eigenschappen van een container. Query's kunnen nog complexer zijn en specifieke veldprojecties, filters en andere algemene SQL-componenten bevatten:

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

Zie Aan de slag met SQL-query's voor meer informatie over de SQL-syntaxis voor Azure Cosmos DB for NoSQL.

Een query uitvoeren op een item

Notitie

In de voorbeelden in dit artikel wordt ervan uitgegaan dat u al een C#-type hebt gedefinieerd voor uw gegevens met de naam Product:

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

Als u een query wilt uitvoeren op items in een container, roept u een van de volgende methoden aan:

Items asynchroon opvragen met behulp van een SQL-query

In dit voorbeeld wordt een SQL-query gemaakt met behulp van een eenvoudige tekenreeks, een feed-iterator opgehaald en vervolgens geneste lussen gebruikt om de resultaten te herhalen. De buitenste while-lus doorloopt de resultaatpagina's, terwijl de binnenste foreach-lus de resultaten binnen een pagina herhaalt.

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

De methode Container.GetItemQueryIterator<> retourneert een FeedIterator<> die wordt gebruikt om resultaten met meerdere pagina's te doorlopen. De HasMoreResults eigenschap geeft aan of er meer resultaatpagina's over zijn. De ReadNextAsync methode haalt de volgende pagina met resultaten op als een opsomming die vervolgens in een lus wordt gebruikt om de resultaten te herhalen.

U kunt ook QueryDefinition gebruiken om een SQL-query te maken met geparameteriseerde invoer:

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

Tip

Geparameteriseerde invoerwaarden kunnen helpen bij het voorkomen van veel voorkomende aanvallen met SQL-queryinjectie.

Asynchroon query's uitvoeren op items met LINQ

In dit voorbeeld wordt een IQueryable<> -object gebruikt om een Language Integrated Query (LINQ) te maken. De resultaten worden vervolgens gecureerd met behulp van een feed-iterator.

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

Met de methode Container.GetItemLinqQueryable<> wordt een IQueryable gemaakt om de LINQ-query te bouwen. Vervolgens wordt de ToFeedIterator<> methode gebruikt om de LINQ-queryexpressie te converteren naar een FeedIterator<>.

Tip

Hoewel u de IQueryable<>kunt herhalen, is deze bewerking synchroon. Gebruik de ToFeedIterator<> methode om resultaten asynchroon te verzamelen.

Volgende stappen

Nu u een query hebt uitgevoerd op meerdere items, kunt u een van onze end-to-end zelfstudies met de API voor NoSQL proberen.