Exercício - Ler e consultar itens
Lembre-se de que seu aplicativo deve adicionar itens a um contêiner do Azure Cosmos DB para NoSQL e ler esses mesmos itens novamente como validação. Neste ponto, seu aplicativo adiciona itens com êxito ao contêiner. Há duas maneiras principais de ler um item: executando uma leitura pontual ou executando uma consulta.
Neste momento, existem três requisitos fundamentais:
- Ponto de leitura de um item usando o identificador exclusivo e o valor da chave de partição
- Criar uma consulta usando uma cadeia de caracteres de consulta simples
- Paginar os resultados da consulta usando um iterador de feed
Depois de concluir este exercício, a sua candidatura estará quase pronta. Você tem consultas que podem ler a categoria e os itens de produto que você criou anteriormente.
Ponto de leitura de um item
A maneira mais simples de recuperar um item no Azure Cosmos DB é executar uma leitura pontual. As leituras pontuais usam um número pequeno e previsível de RUs em comparação com as consultas. Aqui, você aponta ler o item de categoria única capacetes que você criou.
Regresse ao ficheiro Program.cs .
Crie uma nova instância PartitionKey para
gear-climb-helmets
.PartitionKey readKey = new("gear-climb-helmets");
Use Container.ReadItemAsync para apontar para ler um item específico usando a propriedade id e o valor da chave de partição.
ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>( id: "91f79374-8611-4505-9c28-3bbbf1aa7df7", partitionKey: readKey );
Obtenha seu tipo genérico serializado usando a propriedade Resource da classe ItemResponse .
Category readItem = readResponse.Resource;
Saída do identificador exclusivo e taxa de solicitação para a operação de leitura pontual.
Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");
Salve o arquivo Program.cs .
Executar uma consulta
Em situações em que você precisa de vários itens, você pode usar uma consulta para localizar e recuperar esses itens. Lembre-se de que usamos a propriedade categoryId partition key para agrupar nossos itens em categorias específicas. Se incluirmos essa propriedade em uma consulta, efetivamente criaremos uma consulta com escopo para uma única partição lógica. Agora, você usa uma consulta para encontrar todos os itens na categoria tendas .
No Program.cs, crie uma nova cadeia de caracteres para a consulta
SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'
. No entanto, use um parâmetro nomeado@partitionKey
para o filtro categoryId .string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
Crie uma nova instância da classe QueryDefinition com sua cadeia de caracteres de consulta.
var query = new QueryDefinition( query: statement );
Use o método fluent WithParameter para atribuir o
gear-camp-tents
valor ao@partitionKey
parâmetro.var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
Use Container.GetItemQueryIterator<> para recuperar um iterador para sua consulta específica.
using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>( queryDefinition: parameterizedQuery );
Escreva a consulta no console.
Console.WriteLine($"[Start query]:\t{statement}");
Salve o arquivo Program.cs .
Paginar resultados da consulta
O Azure Cosmos DB divide automaticamente os resultados da consulta em páginas que podem ser recuperadas de forma assíncrona. Para gerenciar essas páginas, você precisa escrever seu código C# de uma maneira específica para garantir que você recupere todas as páginas de resultados disponíveis. Aqui, você usará um loop while e foreach em C# para iterar sobre páginas de resultados.
No Program.cs, crie uma nova variável dupla chamada totalRequestCharge definida como um valor de
0
.double totalRequestCharge = 0d;
Crie um loop while que itera até que a propriedade FeedIterator.HasMoreResults do iterador de feed seja false.
while (feed.HasMoreResults) { }
Dentro do loop while, obtenha uma nova página de resultados usando o método FeedIterator.ReadNextAsync.
FeedResponse<Product> page = await feed.ReadNextAsync();
Ainda dentro do loop while, incremente a cobrança total da solicitação usando o valor de FeedResponse.RequestCharge.
totalRequestCharge += page.RequestCharge;
Ainda dentro do loop while , crie um novo loop foreach para iterar sobre os itens reais na página.
foreach (Product item in page) { }
Dentro do loop foreach , escreva no console as propriedades id e name do item retornado.
Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
Fora do loop while, escreva no console a taxa total de solicitação que você calculou.
Console.WriteLine($"[Query metrics]:\t(RUs: {totalRequestCharge})");
Gorjeta
Se você não tiver certeza sobre qual código deve estar dentro ou fora dos loops while e foreach , vá para a seção de código de revisão em Verifique seu trabalho.
Salve o arquivo Program.cs .
Verifique o seu trabalho
Seu aplicativo agora lê e consulta itens do contêiner. Aqui, você executa o aplicativo para que possa observar os resultados de ambas as operações.
Execute o aplicativo .NET no terminal:
dotnet run
Observe a saída da execução do aplicativo. A saída deve corresponder ao exemplo aqui:
... [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)
Gorjeta
As RUs mostradas neste exemplo de saída podem variar da sua saída.
Você notou que seu item de categoria foi desserializado com sucesso no tipo que você usa para produtos? Como o item de categoria não tinha uma propriedade name , essa propriedade foi deixada com seu valor padrão. Verificação de tipo, gerenciamento de esquema e serialização/desserialização são tudo coisas que seu aplicativo pode gerenciar inteiramente do lado do cliente.