Exercício – Enumerar itens usando a LINQ (consulta integrada à linguagem)
Embora o aplicativo já atenda a todos os requisitos, ainda há mais uma alteração que pode ser feita. Os desenvolvedores de C# usam a sintaxe LINQ (consulta integrada à linguagem) para executar consultas em coleções de dados. O SDK do .NET para o Azure Cosmos DB for NoSQL vem com um mecanismo interno para criar sua consulta usando a sintaxe do método LINQ.
Há dois requisitos principais no momento:
- Criar uma consulta usando a sintaxe LINQ
- Converter a consulta em um iterador de feed para obter resultados
Depois de concluir este exercício, suas consultas agora usarão a sintaxe LINQ para facilitar a manutenção do aplicativo pelos desenvolvedores.
Consultar usando expressões LINQ
Sua equipe deseja uma consulta exclusiva que retorne todos os produtos dentro do contêiner, independentemente da categoria. Lembre-se de que usamos a propriedade type para separar nossos itens de categoria dos de produto individuais. Aqui, vamos criar uma consulta entre partições usando a sintaxe do método LINQ.
Dica
Como estamos consultando várias categorias, isso comporá nossa consulta entre partições. Essa consulta poderia potencialmente usar mais RUs do que uma consulta com escopo para um único valor de chave de partição lógica.
Abra o arquivo Program.cs uma última vez.
Crie uma LINQ que pode ser consultada usando o método GetItemLinqQueryable.
IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
Crie uma expressão LINQ usando os métodos Where e OrderBy e armazene a expressão em uma nova variável.
var matches = queryable .Where(p => p.Type == nameof(Product)) .Where(p => !p.Archived) .OrderBy(p => p.Price);
Use o método IOrderedQueryable<>.ToFeedIterator para obter um iterador de feed da expressão LINQ.
using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
Gere uma mensagem para o console.
Console.WriteLine($"[Start LINQ query]");
Salve o arquivo Program.cs.
Paginar os resultados da consulta LINQ
Como estamos consultando várias partições lógicas, precisamos garantir que retornemos todos os resultados, mesmo que uma partição lógica não tenha resultados correspondentes. Por exemplo, a categoria capacetes não tem produtos correspondentes. Se não retornássemos todas as páginas possíveis, nosso aplicativo poderia parar inadvertidamente quando visse uma página vazia de resultados para a categoria capacetes. Aqui, você usa novamente um loop while e foreach em C# para iterar em todas as páginas de resultados. O código deve ser semelhante ao modo como você usou um iterador de feed anteriormente.
Em Program.cs, crie um loop while que itera até que o iterador de feed não tenha mais páginas.
while (linqFeed.HasMoreResults) { }
Dentro do loop while, obtenha uma nova página de resultados.
FeedResponse<Product> page = await linqFeed.ReadNextAsync();
Ainda dentro do loop while, gere a cobrança de solicitação da página atual.
Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
Ainda dentro do loop while, crie um loop foreach para iterar sobre os itens da página.
foreach (Product item in page) { }
Dentro do loop foreach, escreva os itens individuais no console.
Console.WriteLine($"[Returned item]:\t{item}");
Salve o arquivo Program.cs.
Verificar seu trabalho
Seu aplicativo agora usa LINQ para criar uma consulta entre partições que sua equipe de desenvolvedores entende nativamente. Aqui, você executa o aplicativo uma última vez para garantir que todas as consultas retornem os resultados esperados.
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:
[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 }
Dica
As RUs mostradas nesta saída de exemplo podem variar de acordo com a saída.