Oefening: items opsommen met behulp van language-integrated query (LINQ)

Voltooid

Hoewel de toepassing al aan alle vereisten voldoet, is er nog een wijziging die we kunnen aanbrengen. C#-ontwikkelaars gebruiken de LINQ-syntaxis (Language Integrated Query) om query's uit te voeren op verzamelingen gegevens. De .NET SDK voor Azure Cosmos DB for NoSQL wordt geleverd met een ingebouwd mechanisme om uw query te bouwen met behulp van de syntaxis van de LINQ-methode.

Er zijn op dit moment twee belangrijke vereisten:

  1. Een nieuwe query maken met behulp van LINQ-syntaxis
  2. De query converteren naar een feed-iterator om resultaten op te halen

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

Nadat u deze oefening hebt voltooid, gebruiken uw query's nu de LINQ-syntaxis om het voor ontwikkelaars gemakkelijker te maken om uw toepassing in de toekomst te onderhouden.

Query uitvoeren met LINQ-expressies

Uw team wil een unieke query die alle producten binnen de container retourneert, ongeacht de categorie. Zoals u weet, hebben we de eigenschap type gebruikt om onze categorie-items van de afzonderlijke productitems te scheiden. Hier gaan we een query voor meerdere partities maken met behulp van de syntaxis van de LINQ-methode.

Tip

Omdat we query's uitvoeren in meerdere categorieën, wordt hiermee de query kruislings gepartitioneert. Deze query kan mogelijk meer RU's gebruiken dan een query die is gericht op één logische partitiesleutelwaarde.

  1. Open het bestand Program.cs nog één keer.

  2. Maak een nieuwe LINQ-query die kan worden uitgevoerd met behulp van de GetItemLinqQueryable methode.

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Bouw een LINQ-expressie met behulp van de methoden Where en OrderBy en sla de expressie op in een nieuwe variabele.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. Gebruik de IOrderedQueryable<>. Methode ToFeedIterator om een feed-iterator op te halen uit de LINQ-expressie.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Voer een bericht uit naar de console.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Sla het bestand Program.cs op.

Resultaten van LINQ-query's pagineren

Omdat we query's uitvoeren op meerdere logische partities, moeten we ervoor zorgen dat we alle resultaten retourneren, zelfs als een logische partitie geen overeenkomende resultaten heeft. De categorie helmen heeft bijvoorbeeld geen overeenkomende producten. Als we niet alle mogelijke pagina's hebben geretourneerd, kan onze toepassing per ongeluk stoppen wanneer er een lege pagina met resultaten voor de helmcategorie wordt weergegeven. Hier gebruikt u opnieuw een tijdje en foreach-lus in C# om alle resultaatpagina's te herhalen. De code moet vergelijkbaar zijn met de manier waarop u eerder een feed-iterator hebt gebruikt.

  1. Maak in Program.cs een while-lus die doorloopt totdat de feed-iterator geen pagina's meer heeft.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. Haal in de while-lus een nieuwe pagina met resultaten op.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. Voer de aanvraagkosten van de huidige pagina uit in de while-lus .

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Maak nog steeds binnen de while-lus een nieuwe foreach-lus om de items van de pagina te herhalen.

    foreach (Product item in page)
    {
    }
    
  5. Schrijf in de foreach-lus de afzonderlijke items naar de console.

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

Controleer uw werk

Uw app maakt nu gebruik van LINQ om een query voor meerdere partities te bouwen die uw ontwikkelaarsteam systeemeigen begrijpt. Hier voert u de toepassing een laatste keer uit om ervoor te zorgen dat alle query's de verwachte resultaten retourneren.

  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:

    [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 }
    

    Tip

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