Övning – Räkna upp objekt med hjälp av språkintegrerad fråga (LINQ)

Slutförd

Även om programmet redan uppfyller alla krav finns det fortfarande en ändring som vi kan göra. C#-utvecklare använder linq-syntaxen (language-integrated query) för att utföra frågor över datasamlingar. .NET SDK för Azure Cosmos DB for NoSQL levereras med en inbyggd mekanism för att skapa din fråga med linq-metodsyntaxen.

Det finns två viktiga krav just nu:

  1. Skapa en ny fråga med LINQ-syntax
  2. Konvertera frågan till en feed-iterator för att få resultat

Illustration of icons indicating data being queried using a LINQ expression.

När du har slutfört den här övningen använder dina frågor nu LINQ-syntaxen för att göra det enklare för utvecklare att underhålla programmet framåt.

Fråga med LINQ-uttryck

Ditt team vill ha en unik fråga som returnerar alla produkter i containern oavsett kategori. Kom ihåg att vi använde typegenskapen för att separera våra kategoriobjekt från de enskilda produktartiklarna. Här ska vi skapa en fråga mellan partitioner med hjälp av LINQ-metodsyntaxen.

Dricks

Eftersom vi kör frågor i flera kategorier blir frågan korspartitionerad. Den här frågan kan potentiellt använda fler RU:er än en fråga som är begränsad till ett enda logiskt partitionsnyckelvärde.

  1. Öppna filen Program.cs en sista gång.

  2. Skapa en ny LINQ-fråge som kan köras med hjälp GetItemLinqQueryable av metoden .

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Skapa ett LINQ-uttryck med metoderna Where och OrderBy och lagra uttrycket i en ny variabel.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. Använd IOrderedQueryable<>. ToFeedIterator-metoden för att hämta en feed-iterator från LINQ-uttrycket.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Skicka ett meddelande till konsolen.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Spara filen Program.cs.

Sidnumrera LINQ-frågeresultat

Eftersom vi frågar över flera logiska partitioner måste vi se till att vi returnerar alla resultat även om en logisk partition inte har några matchande resultat. Till exempel har hjälmkategorin inga matchande produkter. Om vi inte returnerar alla möjliga sidor kan vårt program oavsiktligt stoppas när det ser en tom sida med resultat för kategorin hjälmar . Här använder du igen en stund och foreach-loop i C# för att iterera över alla resultatsidor. Koden bör likna hur du använde en feed-iterator tidigare.

  1. I Program.cs skapar du en while-loop som itererar tills feed-iteratorn inte har fler sidor.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. I while-loopen får du en ny sida med resultat.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. Fortfarande inne i while-loopen matar du ut den aktuella sidans begärandeavgift.

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Skapa en ny foreach-loop som itererar över sidans objekt i while-loopen.

    foreach (Product item in page)
    {
    }
    
  5. I foreach-loopen skriver du de enskilda objekten till konsolen.

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

Kontrollera ditt arbete

Din app använder nu LINQ för att skapa en fråga mellan partitioner som utvecklarteamet förstår internt. Här kör du programmet en sista gång för att säkerställa att alla frågor returnerar de resultat du förväntade dig.

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

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

    [Start LINQ query]
    [Page RU charge]:       3
    [Returned item]:        Product { Id = 6e3b7275-57d4-4418-914d-14d1baca0979, CategoryId = gear-camp-tents, Type = Product, Name = Nimbolo Tent, Price = 330, Archived = False, Quantity = 35 }
    [Returned item]:        Product { Id = e8dddee4-9f43-4d15-9b08-0d7f36adcac8, CategoryId = gear-camp-tents, Type = Product, Name = Cirroa Tent, Price = 490, Archived = False, Quantity = 15 }
    [Returned item]:        Product { Id = e6f87b8d-8cd7-4ade-a005-14d3e2fbd1aa, CategoryId = gear-camp-tents, Type = Product, Name = Kuloar Tent, Price = 530, Archived = False, Quantity = 8 }
    

    Dricks

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