Cvičení – čtení a dotazování položek
Vzpomeňte si, že se očekává, že vaše aplikace bude přidávat položky do kontejneru Azure Cosmos DB for NoSQL a číst stejné položky zpět jako ověřování. V tomto okamžiku vaše aplikace úspěšně přidá položky do kontejneru. Položky můžete číst dvěma klíčovými způsoby: provedením čtení bodu nebo provedením dotazu.
V tuto chvíli existují tři klíčové požadavky:
- Načtení položky pomocí jedinečného identifikátoru i hodnoty klíče oddílu
- Vytvoření dotazu pomocí jednoduchého řetězce dotazu
- Stránkování výsledků dotazu pomocí iterátoru informačního kanálu
Po dokončení tohoto cvičení bude vaše aplikace téměř připravená. Máte dotazy, které si můžou přečíst kategorii a položky produktu, které jste vytvořili dříve.
Načíst položku
Nejjednodušší způsob, jak načíst položku ve službě Azure Cosmos DB, je provést čtení bodu. Čtení bodů používá v porovnání s dotazy malý a předvídatelný počet RU. Tady si můžete přečíst helmy s jednou položkou kategorie, kterou jste vytvořili.
Vraťte se do souboru Program.cs .
Vytvořte novou instanci PartitionKey pro
gear-climb-helmets
.PartitionKey readKey = new("gear-climb-helmets");
Pomocí Container.ReadItemAsync nasměrujte na čtení konkrétní položky pomocí vlastnosti ID a hodnoty klíče oddílu.
ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>( id: "91f79374-8611-4505-9c28-3bbbf1aa7df7", partitionKey: readKey );
Získejte serializovaný obecný typ pomocí Resource vlastnost ItemResponse třídy.
Category readItem = readResponse.Resource;
Výstupem jedinečného identifikátoru a poplatku za požadavek na operaci čtení bodu.
Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");
Uložte soubor Program.cs.
Provedení dotazu
V situacích, kdy potřebujete více položek, můžete tyto položky najít a načíst pomocí dotazu. Vzpomeňte si, že jsme použili vlastnost klíče oddílu categoryId k seskupení položek do konkrétních kategorií. Pokud do dotazu zahrneme danou vlastnost, v podstatě vytvoříme dotaz s vymezeným oborem na jeden logický oddíl. Teď pomocí dotazu vyhledáte všechny položky v kategorii stanů .
V souboru Program.cs vytvořte nový řetězec pro dotaz
SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'
. Použijte však parametr pojmenovaný@partitionKey
pro filtr categoryId .string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
Vytvořte novou instanci Třídy QueryDefinition s řetězcem dotazu.
var query = new QueryDefinition( query: statement );
Pomocí fluent WithParameter metoda přiřadit
gear-camp-tents
hodnotu parametru@partitionKey
.var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
Pomocí Container.GetItemQueryIterator<> načtěte iterátor pro váš konkrétní dotaz.
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>( queryDefinition: parameterizedQuery );
Napište dotaz do konzoly.
Console.WriteLine($"[Start query]:\t{statement}");
Uložte soubor Program.cs.
Stránkování výsledků dotazu
Azure Cosmos DB automaticky rozdělí výsledky dotazu na stránky, které je možné načíst asynchronně. Pokud chcete tyto stránky spravovat, musíte kód jazyka C# napsat určitým způsobem, abyste měli jistotu, že načtete všechny stránky výsledků, které jsou k dispozici. Tady použijete smyčku while a foreach v jazyce C# k iteraci na stránkách výsledků.
V souboru Program.cs vytvořte novou dvojitou proměnnou s názvem totalRequestCharge nastavenou na hodnotu
0
.double totalRequestCharge = 0d;
Vytvořte smyčku while , která iteruje, dokud FeedIterator.HasMoreResults vlastnost iterátoru informačního kanálu není false.
while (feed.HasMoreResults) { }
Uvnitř smyčky while získejte novou stránku výsledků pomocí Metody FeedIterator.ReadNextAsync.
FeedResponse<Product> page = await feed.ReadNextAsync();
Stále uvnitř smyčky while zvýšíte celkové poplatky za žádost pomocí hodnoty FeedResponse.RequestCharge.
totalRequestCharge += page.RequestCharge;
Ve smyčce While vytvořte novou smyčku foreach, která iteruje skutečné položky na stránce.
foreach (Product item in page) { }
Uvnitř smyčky foreach zapište do konzoly vlastnosti ID a názvu vrácené položky.
Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
Mimo smyčku While zapište do konzoly celkové poplatky za požadavky, které jste vypočítali.
Console.WriteLine($"[Query metrics]:\t(RUs: {totalRequestCharge})");
Tip
Pokud si nejste jistí, jaký kód by měl být uvnitř smyčky a smyčky foreach nebo mimo tento kód, přejděte do části kontrola kódu v části Kontrola práce.
Uložte soubor Program.cs.
Kontrola práce
Aplikace teď čte a dotazuje položky z kontejneru. Tady spustíte aplikaci, abyste mohli sledovat výsledky obou operací.
Spusťte aplikaci .NET v terminálu:
dotnet run
Sledujte výstup spuštění aplikace. Výstup by se měl shodovat s následujícím příkladem:
... [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
Jednotky RU zobrazené v tomto příkladu výstupu se můžou lišit od výstupu.
Všimli jste si, že položka kategorie byla úspěšně deserializována do typu, který používáte pro produkty? Vzhledem k tomu, že položka kategorie neměla vlastnost názvu , byla tato vlastnost ponechána na výchozí hodnotě. Kontrola typů, správa schémat a serializace/deserializace jsou všechno, co může vaše aplikace spravovat zcela na straně klienta.