Oefening: items lezen en opvragen

Voltooid

Zoals u weet, voegt uw toepassing naar verwachting beide items toe aan een Azure Cosmos DB for NoSQL-container en leest u dezelfde items terug als validatie. Op dit moment voegt uw toepassing items toe aan de container. Er zijn twee belangrijke manieren om een item te lezen: door een punt te lezen of door een query uit te voeren.

Er zijn op dit moment drie belangrijke vereisten:

  1. Een item laten lezen met zowel de unieke id als de partitiesleutelwaarde
  2. Een query maken met behulp van een eenvoudige querytekenreeks
  3. De resultaten van de query pagineren met behulp van een feed-iterator

Illustration of icons indicating data being queried using a query.

Nadat u deze oefening hebt voltooid, is uw toepassing bijna gereed. U hebt query's die de categorie en productitems kunnen lezen die u eerder hebt gemaakt.

Een item lezen

De eenvoudigste manier om een item op te halen in Azure Cosmos DB is door een puntleesbewerking uit te voeren. Puntleesbewerkingen maken gebruik van een klein en voorspelbaar aantal RU's in vergelijking met query's. Hier wijst u de helmen met één categorie-item aan dat u hebt gemaakt.

  1. Ga terug naar het bestand Program.cs .

  2. Maak een nieuw PartitionKey-exemplaar voor gear-climb-helmets.

    PartitionKey readKey = new("gear-climb-helmets");
    
  3. Gebruik Container.ReadItemAsync om een specifiek item aan te wijzen met behulp van de id-eigenschap en de waarde van de partitiesleutel.

    ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>(
        id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        partitionKey: readKey
    );
    
  4. Haal het geserialiseerde algemene type op met behulp van de eigenschap Resource van de klasse ItemResponse .

    Category readItem = readResponse.Resource;
    
  5. Voer de unieke id en de aanvraagkosten voor de leesbewerking van het punt uit.

    Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");    
    
  6. Sla het bestand Program.cs op.

Een query uitvoeren

In situaties waarin u meerdere items nodig hebt, kunt u een query gebruiken om deze items te zoeken en op te halen. Zoals u weet, hebben we de eigenschap partitionId-partitiesleutel gebruikt om onze items te groeperen in specifieke categorieën. Als we die eigenschap in een query opnemen, bouwen we effectief een query die is gericht op één logische partitie. U gebruikt nu een query om alle items in de categorie tenten te vinden.

  1. Maak in Program.cs een nieuwe tekenreeks voor de querySELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'. Gebruik echter een parameter met de naam @partitionKey voor het categoryId-filter .

    string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
    
  2. Maak een nieuw exemplaar van de klasse QueryDefinition met uw querytekenreeks.

    var query = new QueryDefinition(
        query: statement
    );
    
  3. Gebruik de fluent WithParameter-methode om de gear-camp-tents waarde toe te wijzen aan de @partitionKey parameter.

    var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
    
  4. Gebruik Container.GetItemQueryIterator<> om een iterator voor uw specifieke query op te halen.

    using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
        queryDefinition: parameterizedQuery
    );
    
  5. Schrijf de query naar de console.

    Console.WriteLine($"[Start query]:\t{statement}");
    
  6. Sla het bestand Program.cs op.

Resultaten van gepagineerde query's

Azure Cosmos DB breekt uw queryresultaten automatisch op in pagina's die asynchroon kunnen worden opgehaald. Als u deze pagina's wilt beheren, moet u uw C#-code op een specifieke manier schrijven om ervoor te zorgen dat u alle pagina's met resultaten ophaalt die beschikbaar zijn. Hier gebruikt u een tijdje en foreach-lus in C# om de resultatenpagina's te herhalen.

  1. Maak in Program.cs een nieuwe dubbele variabele met de naam totalRequestCharge ingesteld op een waarde van 0.

    double totalRequestCharge = 0d;
    
  2. Maak een tijdjelus die doorloopt totdat de eigenschap FeedIterator.HasMoreResults van uw feed-iterator onwaar is.

    while (feed.HasMoreResults)
    {
    }
    
  3. Haal in de while-lus een nieuwe pagina met resultaten op met behulp van de methode FeedIterator.ReadNextAsync .

    FeedResponse<Product> page = await feed.ReadNextAsync();
    
  4. Nog steeds binnen de while-lus kunt u de totale aanvraagkosten verhogen met behulp van de waarde van FeedResponse.RequestCharge.

    totalRequestCharge += page.RequestCharge;
    
  5. Maak nog steeds binnen de while-lus een nieuwe foreach-lus om de werkelijke items op de pagina te herhalen.

    foreach (Product item in page)
    {
    }
    
  6. Schrijf in de foreach-lus naar de console de id en naameigenschappen van het geretourneerde item.

    Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
    
  7. Schrijf buiten de while-lus naar de console de totale aanvraagkosten die u hebt berekend.

    Console.WriteLine($"[Query metrics]:\t(RUs: {totalRequestCharge})");
    

    Tip

    Als u niet zeker weet welke code zich binnen of buiten de tijdje bevindt en foreach-lussen, gaat u naar de sectie Code controleren in Controleer uw werk.

  8. Sla het bestand Program.cs op.

Controleer uw werk

Uw app leest nu items uit de container en voert er query's op uit. Hier voert u de toepassing uit, zodat u de resultaten van beide bewerkingen kunt bekijken.

  1. Voer de .NET-toepassing uit in de terminal:

    dotnet run
    
  2. Bekijk de uitvoer van het uitvoeren van de toepassing. De uitvoer moet hier overeenkomen met het voorbeeld:

    ...
    [Point read item]:      91f79374-8611-4505-9c28-3bbbf1aa7df7    (RUs: 1)
    [Start query]:          SELECT * FROM products p WHERE p.categoryId = @partitionKey
    [Returned item]:        5df21ec5-813c-423e-9ee9-1a2aaead0be4    (Name: N/A)
    [Returned item]:        e8dddee4-9f43-4d15-9b08-0d7f36adcac8    (Name: Cirroa Tent)
    [Returned item]:        e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa    (Name: Kuloar Tent)
    [Returned item]:        f7653468-c4b8-47c9-97ff-451ee55f4fd5    (Name: Mammatin Tent)
    [Returned item]:        6e3b7275-57d4-4418-914d-14d1baca0979    (Name: Nimbolo Tent)
    [Query metrics]:        (RUs: 2.94)
    

    Tip

    De RU's die in dit voorbeeld worden weergegeven, kunnen afwijken van uw uitvoer.

    Hebt u gemerkt dat uw categorie-item is gedeserialiseerd in het type dat u voor producten gebruikt? Omdat het categorie-item geen naameigenschap heeft, is die eigenschap overgelaten aan de standaardwaarde. Typecontrole, schemabeheer en serialisatie/deserialisatie zijn alles wat uw toepassing volledig kan beheren aan de clientzijde.