Упражнение. Перечисление элементов с помощью LINQ

Завершено

Хотя приложение уже соответствует всем требованиям, мы можем внести еще одно изменение. Разработчики C# используют синтаксис LINQ для выполнения запросов по коллекциям данных. Пакет SDK для .NET для Azure Cosmos DB для NoSQL поставляется со встроенным механизмом для создания запроса с помощью синтаксиса метода LINQ.

Сейчас существуют два основных требования:

  1. Создать новый запрос с помощью синтаксиса LINQ.
  2. Преобразовать запроса в итератор веб-канала для получения результатов.

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

После выполнения этого упражнения ваши запросы теперь будут использовать синтаксис LINQ, чтобы упростить разработчикам процесс поддержки приложения в долгосрочном плане.

Запрос с помощью выражений LINQ

Вашей команде требуется уникальный запрос, который возвращает все products в контейнере независимо от категории. Помните, что мы использовали свойство type для разделения элементов категории от отдельных элементов продукта. Здесь мы создадим межсекционный запрос с помощью синтаксиса метода LINQ.

Совет

Так как мы запрашиваем несколько категорий, это приведет к выполнению запроса между секциями. Этот запрос может использовать больше единиц запросов, чем запрос, который область в одно значение ключа логического раздела.

  1. Откройте файл Program.cs в последний раз.

  2. Создайте запрос LINQ с помощью метода GetItemLinqQueryable.

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Создайте выражение LINQ с помощью методов Where и OrderBy и сохраните выражение в новой переменной.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. Используйте метод IOrderedQueryable<>.ToFeedIterator, чтобы получить итератор веб-канала из выражения LINQ.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Выведите сообщение в окно консоли.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Сохраните файл Program.cs.

Разбиение результатов запроса LINQ на страницы

Так как мы запрашиваем несколько логических секций, необходимо убедиться, что мы возвращаем все результаты, даже если логическая секция не имеет совпадающих результатов. Например, в категории helmets нет соответствующих продуктов. Если бы мы не вернули все возможные страницы, наше приложение может непреднамеренно остановиться, когда он видит пустую страницу результатов для категории шлемов . Здесь вы снова используете некоторое время и цикл foreach в C# для итерации на всех страницах результатов. Код должен быть похож на использовавшийся ранее для итератора веб-канала.

  1. В Program.cs создайте цикл времени , который выполняет итерацию до тех пор, пока итератор веб-канала больше не имеет страниц.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. Внутри цикла while получите новую страницу результатов.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. По-прежнему внутри цикла while выведите плату за запрос текущей страницы.

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Внутри цикла while создайте цикл foreach, чтобы выполнить итерацию по элементам страницы.

    foreach (Product item in page)
    {
    }
    
  5. В цикле foreach введите отдельные элементы в окно консоли.

    Console.WriteLine($"[Returned item]:\t{item}");
    
  6. Сохраните файл Program.cs.

Проверьте свою работу

Теперь приложение использует LINQ для создания межсекционного запроса, который является изначально понятным вашей команде разработчиков. Здесь вы запускаете приложение в последний раз, чтобы все запросы возвращали ожидаемые результаты.

  1. Запустите приложение .NET в терминале:

    dotnet run
    
  2. Просмотрите выходные данные запуска приложения. Выходные данные должны соответствовать примеру:

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

    Совет

    ЕЗ в этом примере выходных данных могут отличаться от тех, которые в ваших выходных данных.