Latihan - Menghitung item dengan kueri terintegrasi bahasa (LINQ)

Selesai

Meskipun aplikasi sudah memenuhi semua persyaratan, masih ada satu perubahan lagi yang dapat kita lakukan. Pengembang C# menggunakan sintaks kueri terintegrasi bahasa (LINQ) untuk melakukan kueri atas kumpulan data. .NET SDK untuk Azure Cosmos DB for NoSQL dilengkapi dengan mekanisme bawaan untuk membangun kueri Anda menggunakan sintaks metode LINQ.

Ada dua persyaratan kunci saat ini:

  1. Membangun kueri baru menggunakan sintaks LINQ
  2. Mengonversi kueri menjadi iterator umpan untuk mendapatkan hasil

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

Setelah Anda menyelesaikan latihan ini, kueri Anda sekarang akan menggunakan sintaks LINQ untuk memudahkan pengembang memelihara aplikasi Anda ke depannya.

Kueri menggunakan ekspresi LINQ

Tim Anda menginginkan kueri unik yang mengembalikan semua produk di dalam kontainer terlepas dari kategorinya. Ingat, kita menggunakan properti jenis untuk memisahkan item kategori kita dari item produk individual. Kita akan membuat kueri lintas partisi menggunakan sintaks metode LINQ di sini.

Tip

Karena kita mengkueri di beberapa kategori, ini akan membuat kueri kita lintas partisi. Kueri ini berpotensi menggunakan lebih banyak RU daripada kueri yang dilingkup ke satu nilai kunci partisi logis.

  1. Buka file Program.cs untuk terakhir kalinya.

  2. Buat LINQ baru yang dapat dikueri menggunakan metode GetItemLinqQueryable.

    IOrderedQueryable<Product> queryable = container.GetItemLinqQueryable<Product>();
    
  3. Buat ekspresi LINQ menggunakan metode Where dan OrderBy, lalu simpan ekspresi dalam variabel baru.

    var matches = queryable
        .Where(p => p.Type == nameof(Product))
        .Where(p => !p.Archived)
        .OrderBy(p => p.Price);
    
  4. Gunakan metode IOrderedQueryable<>.ToFeedIterator untuk mendapatkan iterator umpan dari ekspresi LINQ.

    using FeedIterator<Product> linqFeed = matches.ToFeedIterator();
    
  5. Keluarkan pesan ke konsol.

    Console.WriteLine($"[Start LINQ query]");
    
  6. Simpan file Program.cs.

Membuat halaman hasil kueri

Karena kita mengkueri di beberapa partisi logis, kita perlu memastikan bahwa kita mengembalikan semua hasil bahkan jika partisi logis tidak memiliki hasil yang cocok. Misalnya, kategori helm tidak memiliki produk yang sesuai. Jika kami tidak mengembalikan semua halaman yang mungkin, aplikasi kami secara tidak sengaja dapat berhenti ketika melihat halaman hasil kosong untuk kategori helm . Di sini, Anda lagi menggunakan perulangan sementara dan foreach di C# untuk melakukan iterasi di semua halaman hasil. Kode harus mirip dengan cara Anda menggunakan iterator umpan sebelumnya.

  1. Di Program.cs, buat perulangan sementara yang berulang hingga iterator umpan tidak memiliki halaman lagi.

    while (linqFeed.HasMoreResults)
    {    
    }
    
  2. Di dalam perulangan sementara, dapatkan halaman hasil baru.

    FeedResponse<Product> page = await linqFeed.ReadNextAsync();
    
  3. Masih di dalam perulangan sementara, keluarkan biaya permintaan halaman saat ini.

    Console.WriteLine($"[Page RU charge]:\t{page.RequestCharge}");
    
  4. Masih di dalam perulangan sementara, buat perulangan foreach baru untuk mengulangi item halaman.

    foreach (Product item in page)
    {
    }
    
  5. Di dalam perulangan foreach, tulis item individual ke konsol.

    Console.WriteLine($"[Returned item]:\t{item}");
    
  6. Simpan file Program.cs.

Periksa pekerjaan Anda

Aplikasi Anda sekarang menggunakan LINQ untuk membangun kueri lintas partisi yang sangat dipahami tim pengembang Anda. Di sini, Anda menjalankan aplikasi untuk terakhir kalinya untuk memastikan bahwa semua kueri mengembalikan hasil yang Anda harapkan.

  1. Jalankan aplikasi .NET di terminal:

    dotnet run
    
  2. Amati output dari menjalankan aplikasi. Output harus cocok dengan contoh di sini:

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

    Tip

    RU yang ditunjukkan dalam contoh output ini mungkin berbeda dengan output Anda.