Cvičení – výčet položek pomocí jazyka integrovaného dotazu (LINQ)

Dokončeno

I když aplikace už splňuje všechny požadavky, stále existuje ještě jedna další změna, která můžeme provést. Vývojáři jazyka C# používají syntaxi jazyka integrovaných dotazů (LINQ) k provádění dotazů nad kolekcemi dat. Sada .NET SDK pro Azure Cosmos DB for NoSQL obsahuje integrovaný mechanismus pro sestavení dotazu pomocí syntaxe metody LINQ.

V tuto chvíli existují dva klíčové požadavky:

  1. Vytvoření nového dotazu pomocí syntaxe LINQ
  2. Převedení dotazu na iterátor informačního kanálu za účelem získání výsledků

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

Po dokončení tohoto cvičení teď budou vaše dotazy používat syntaxi LINQ, aby vývojářům usnadnila udržování vaší aplikace vpřed.

Dotazování pomocí výrazů LINQ

Váš tým chce jedinečný dotaz, který vrátí všechny produkty v kontejneru bez ohledu na kategorii. Vzpomeňte si, že jsme použili vlastnost typu k oddělení položek kategorie od jednotlivých položek produktu. Tady vytvoříme dotaz napříč oddíly pomocí syntaxe metody LINQ.

Tip

Vzhledem k tomu, že dotazujeme napříč více kategoriemi, vytvoří se dotaz mezi oddíly. Tento dotaz může potenciálně použít více RU než dotaz, který je vymezen na jednu hodnotu klíče logického oddílu.

  1. Naposledy otevřete soubor Program.cs .

  2. Pomocí metody vytvořte nový dotaz LINQ.GetItemLinqQueryable

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Vytvořte výraz LINQ pomocí metod Where a OrderBy a uložte výraz do nové proměnné.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. Použijte IOrderedQueryable<>. Metoda ToFeedIterator pro získání iterátoru informačního kanálu z výrazu LINQ.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Vypíše zprávu do konzoly.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Uložte soubor Program.cs.

Stránkování výsledků dotazu LINQ

Vzhledem k tomu, že dotazujeme více logických oddílů, musíme se ujistit, že vrátíme všechny výsledky, i když logický oddíl neobsahuje žádné odpovídající výsledky. Například kategorie helmy nemá žádné odpovídající produkty. Pokud bychom nevrátili všechny možné stránky, naše aplikace by se mohla neúmyslně zastavit, když uvidí prázdnou stránku výsledků pro kategorii helmy . Tady znovu použijete smyčku while a foreach v jazyce C# k iteraci na všech stránkách výsledků. Kód by měl být podobný tomu, jak jste dříve použili iterátor informačního kanálu.

  1. V souboru Program.cs vytvořte smyčku while , která iteruje, dokud iterátor informačního kanálu nebude mít žádné další stránky.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. Uvnitř smyčky While získáte novou stránku výsledků.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. Stále uvnitř smyčky While vypíšete poplatek za žádost aktuální stránky.

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Uvnitř smyčky While vytvořte novou smyčku foreach, která bude iterovat položky stránky.

    foreach (Product item in page)
    {
    }
    
  5. Uvnitř smyčky foreach zapište jednotlivé položky do konzoly.

    Console.WriteLine($"[Returned item]:\t{item}");
    
  6. Uložte soubor Program.cs.

Kontrola práce

Vaše aplikace teď používá LINQ k vytvoření dotazu napříč oddíly, kterému váš vývojářský tým nativně rozumí. Tady aplikaci spustíte jednou naposledy, abyste zajistili, že všechny dotazy vrátí očekávané výsledky.

  1. Spusťte aplikaci .NET v terminálu:

    dotnet run
    
  2. Sledujte výstup spuštění aplikace. Výstup by se měl shodovat s následujícím příkladem:

    [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

    Jednotky RU zobrazené v tomto příkladu výstupu se můžou lišit od výstupu.