Alıştırma - Dille tümleşik sorguyu (LINQ) kullanarak öğeleri listeleme

Tamamlandı

Uygulama tüm gereksinimleri zaten karşılasa da, yine de bir değişiklik daha yapılabilir. C# geliştiricileri, veri koleksiyonları üzerinde sorgular gerçekleştirmek için dille tümleşik sorgu (LINQ) söz dizimini kullanır. NoSQL için Azure Cosmos DB için .NET SDK'sı, LINQ yöntemi söz dizimini kullanarak sorgunuzu derlemeye yönelik yerleşik bir mekanizmayla birlikte gelir.

Şu anda iki temel gereksinim vardır:

  1. LINQ söz dizimlerini kullanarak yeni sorgu oluşturma
  2. Sonuçları almak için sorguyu akış yineleyicisine dönüştürme

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

Bu alıştırmayı tamamladıktan sonra sorgularınız, geliştiricilerin uygulamanızın ilerlemesini kolaylaştırmak için LINQ söz dizimini kullanır.

LINQ ifadelerini kullanarak sorgulama

Ekibiniz, kategoriden bağımsız olarak kapsayıcıdaki tüm ürünleri döndüren benzersiz bir sorgu istiyor. Kategori öğelerimizi tek tek ürün ürünlerinden ayırmak için type özelliğini kullandığımızı hatırlayın. Burada LINQ yöntemi söz dizimini kullanarak bölümler arası sorgu oluşturacağız.

Bahşiş

Birden çok kategoride sorgu yaptığımızdan, bu sorgumuzun bölümler arası olmasını sağlar. Bu sorgu, kapsamı tek bir mantıksal bölüm anahtarı değeriyle belirlenmiş bir sorgudan daha fazla RU kullanabilir.

  1. Program.cs dosyasını son bir kez açın.

  2. yöntemini kullanarak GetItemLinqQueryable sorgulanabilir yeni bir LINQ oluşturun.

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Where ve OrderBy yöntemlerini kullanarak bir LINQ ifadesi oluşturun ve ifadeyi yeni bir değişkende depolayın.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. IOrderedQueryable<> kullanın. LINQ ifadesinden bir akış yineleyicisi almak için ToFeedIterator yöntemi.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Konsola bir ileti gönderin.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Program.cs dosyasını kaydedin.

LINQ sorgu sonuçlarını sayfalandır

Birden çok mantıksal bölüm arasında sorgu yaptığımızdan, bir mantıksal bölümde eşleşen sonuç olmasa bile tüm sonuçları döndürdüğünüzden emin olmamız gerekir. Örneğin kask kategorisinde eşleşen ürün yoktur. Tüm olası sayfaları döndürmeseydik, kask kategorisi için boş bir sonuç sayfası gördüğünde uygulamamız yanlışlıkla durdurulabilirdi. Burada, tüm sonuç sayfalarını yinelemek için C# dilinde bir while ve foreach döngüsünü tekrar kullanırsınız. Kod, daha önce bir akış yineleyicisi kullandığınıza benzer olmalıdır.

  1. Program.cs dosyasında, akış yineleyicisinde başka sayfa olmayana kadar yinelenen bir while döngüsü oluşturun.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. while döngüsünün içinde yeni bir sonuç sayfası alın.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. Hala while döngüsünün içinde, geçerli sayfanın istek ücretinin çıkışını alın.

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Hala while döngüsünün içinde, sayfanın öğelerini yinelemek için yeni bir foreach döngüsü oluşturun.

    foreach (Product item in page)
    {
    }
    
  5. foreach döngüsünün içinde, tek tek öğeleri konsola yazın.

    Console.WriteLine($"[Returned item]:\t{item}");
    
  6. Program.cs dosyasını kaydedin.

Çalışmanızı denetleyin

Uygulamanız artık LINQ kullanarak geliştirici ekibinizin yerel olarak anladığı bölümler arası bir sorgu oluşturuyor. Burada, uygulamayı son bir kez çalıştırarak tüm sorguların beklediğiniz sonuçları döndürmesini sağlarsınız.

  1. Terminalde .NET uygulamasını çalıştırın:

    dotnet run
    
  2. Uygulamayı çalıştırmanın çıkışını gözlemleyin. Çıktı buradaki örnekle eşleşmelidir:

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

    Bahşiş

    Bu örnek çıktıda gösterilen RU'lar çıkışınızdan farklı olabilir.