Övning – Läsa och fråga efter objekt

Slutförd

Kom ihåg att ditt program förväntas både lägga till objekt i en Azure Cosmos DB för NoSQL-container och läsa samma objekt som validering. Nu lägger programmet till objekt i containern. Det finns två viktiga sätt att läsa ett objekt: genom att utföra en punktläsning eller genom att utföra en fråga.

Det finns tre viktiga krav just nu:

  1. Punktläs ett objekt med både det unika identifieraren och partitionsnyckelvärdet
  2. Skapa en fråga med en enkel frågesträng
  3. Sidnumrera resultatet av frågan med hjälp av en feed-iterator

Illustration of icons indicating data being queried using a query.

När du har slutfört den här övningen är programmet nästan klart. Du har frågor som kan läsa kategorin och produktobjekten som du skapade tidigare.

Punktläs ett objekt

Det enklaste sättet att hämta ett objekt i Azure Cosmos DB är att utföra en punktläsning. Punktläsningar använder ett litet och förutsägbart antal RU:er jämfört med frågor. Här pekar du på att läsa hjälmens enskilda kategoriobjekt som du skapade.

  1. Gå tillbaka till filen Program.cs .

  2. Skapa en ny PartitionKey-instans för gear-climb-helmets.

    PartitionKey readKey = new("gear-climb-helmets");
    
  3. Använd Container.ReadItemAsync för att peka på läsning av ett specifikt objekt med hjälp av id-egenskapen och partitionsnyckelvärdet.

    ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>(
        id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        partitionKey: readKey
    );
    
  4. Hämta den serialiserade generiska typen med hjälp av resursegenskapen för klassen ItemResponse.

    Category readItem = readResponse.Resource;
    
  5. Mata ut den unika identifieraren och begärandeavgiften för punktläsningsåtgärden.

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

Köra en fråga

I situationer där du behöver flera objekt kan du använda en fråga för att hitta och hämta dessa objekt. Kom ihåg att vi använde partitionsnyckelegenskapen categoryId för att gruppera våra objekt i specifika kategorier. Om vi inkluderar den egenskapen i en fråga skapar vi en fråga som är begränsad till en enda logisk partition. Nu använder du en fråga för att hitta alla objekt i tältkategorin.

  1. I Program.cs skapar du en ny sträng för frågan SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'. Använd dock en parameter med namnet @partitionKey för categoryId-filtret .

    string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
    
  2. Skapa en ny instans av klassen QueryDefinition med frågesträngen.

    var query = new QueryDefinition(
        query: statement
    );
    
  3. Använd metoden fluent WithParameter för att tilldela gear-camp-tents värdet till parametern @partitionKey .

    var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
    
  4. Använd Container.GetItemQueryIterator<> för att hämta en iterator för din specifika fråga.

    using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
        queryDefinition: parameterizedQuery
    );
    
  5. Skriv frågan till konsolen.

    Console.WriteLine($"[Start query]:\t{statement}");
    
  6. Spara filen Program.cs.

Sidnumrera frågeresultat

Azure Cosmos DB delar automatiskt upp frågeresultatet på sidor som kan hämtas asynkront. Om du vill hantera dessa sidor måste du skriva C#-koden på ett specifikt sätt för att se till att du hämtar alla sidor med tillgängliga resultat. Här använder du en stunds - och foreach-loop i C# för att iterera över resultatsidor.

  1. I Program.cs skapar du en ny dubbel variabel med namnet totalRequestCharge inställt på värdet 0.

    double totalRequestCharge = 0d;
    
  2. Skapa en while-loop som itererar tills egenskapen FeedIterator.HasMoreResults för din feed-iterator är false.

    while (feed.HasMoreResults)
    {
    }
    
  3. I while-loopen får du en ny sida med resultat med hjälp av metoden FeedIterator.ReadNextAsync.

    FeedResponse<Product> page = await feed.ReadNextAsync();
    
  4. I while-loopenökar du den totala kostnaden för begäran med hjälp av värdet FeedResponse.RequestCharge.

    totalRequestCharge += page.RequestCharge;
    
  5. I while-loopenskapar du en ny foreach-loop för att iterera över de faktiska objekten på sidan.

    foreach (Product item in page)
    {
    }
    
  6. I foreach-loopen skriver du till konsolen egenskaperna id och namn för det returnerade objektet.

    Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
    
  7. Utanför while-loopen skriver du till konsolen den totala kostnaden för begäran som du beräknade.

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

    Dricks

    Om du är osäker på vilken kod som ska finnas i eller utanför while- och foreach-looparna går du till avsnittet granska kod i Kontrollera ditt arbete.

  8. Spara filen Program.cs.

Kontrollera ditt arbete

Appen läser och frågar nu objekt från containern. Här kör du programmet så att du kan se resultatet av båda åtgärderna.

  1. Kör .NET-programmet i terminalen:

    dotnet run
    
  2. Observera utdata från körningen av programmet. Utdata ska matcha exemplet här:

    ...
    [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)
    

    Dricks

    Ru:erna som visas i det här exemplets utdata kan variera från dina utdata.

    Märkte du att kategoriobjektethar deserialiserats till den typ som du använder för produkter? Eftersom kategoriobjektet inte hade någon namnegenskap lämnades den egenskapen till standardvärdet. Typkontroll, schemahantering och serialisering/deserialisering är allt som ditt program kan hantera helt på klientsidan.