Latihan - Membaca serta mengkueri item

Selesai

Ingat bahwa aplikasi Anda diharapkan untuk menambahkan item ke kontainer Azure Cosmos DB for NoSQL dan membaca item yang sama kembali sebagai validasi. Pada titik ini, aplikasi Anda berhasil menambahkan item ke kontainer. Ada dua cara utama untuk membaca item: dengan melakukan baca titik, atau dengan melakukan kueri.

Ada tiga persyaratan utama saat ini:

  1. Baca titik item menggunakan pengenal unik dan nilai kunci partisi
  2. Membuat kueri menggunakan string kueri sederhana
  3. Mem-paginate hasil kueri menggunakan iterator umpan

Illustration of icons indicating data being queried using a query.

Setelah Anda menyelesaikan latihan ini, aplikasi Anda hampir siap. Anda memiliki kueri yang dapat membaca kategori dan item produk yang sebelumnya Anda buat.

Titik membaca sebuah item

Cara paling sederhana untuk mengambil item di Azure Cosmos DB adalah dengan melakukan pembacaan titik. Pembacaan titik menggunakan jumlah RU yang kecil dan dapat diprediksi dibandingkan dengan kueri. Di sini, Anda harus membaca item kategori tunggal helm yang Anda buat.

  1. Kembali ke file Program.cs .

  2. Buat instans PartitionKey baru untuk gear-climb-helmets.

    PartitionKey readKey = new("gear-climb-helmets");
    
  3. Gunakan Container.ReadItemAsync untuk membaca titik item tertentu menggunakan properti id dan nilai kunci partisi.

    ItemResponse<Category> readResponse = await container.ReadItemAsync<Category>(
        id: "91f79374-8611-4505-9c28-3bbbf1aa7df7",
        partitionKey: readKey
    );
    
  4. Dapatkan jenis generik serial Anda menggunakan properti Sumber Daya dari kelas ItemResponse.

    Category readItem = readResponse.Resource;
    
  5. Keluarkan pengenal unik dan biaya permintaan untuk operasi baca titik.

    Console.WriteLine($"[Point read item]:\t{readItem.Id}\t(RUs: {readResponse.RequestCharge})");    
    
  6. Simpan file Program.cs.

Menjalankan kueri

Dalam situasi di mana Anda memerlukan beberapa item, Anda bisa menggunakan kueri untuk menemukan dan mengambil item tersebut. Ingat, kita menggunakan properti kunci partisi categoryId untuk mengelompokkan item kita ke dalam kategori tertentu. Jika kami menyertakan properti tersebut dalam kueri, kami secara efektif membuat kueri yang dilingkup ke satu partisi logis. Sekarang, Anda menggunakan kueri untuk menemukan semua item dalam kategori tenda .

  1. Di Program.cs, buat string baru untuk kueri SELECT * FROM products p WHERE p.categoryId = 'gear-camp-tents'. Namun, gunakan parameter bernama @partitionKey untuk filter categoryId.

    string statement = "SELECT * FROM products p WHERE p.categoryId = @partitionKey";
    
  2. Buat instans baru kelas QueryDefinition dengan string kueri Anda.

    var query = new QueryDefinition(
        query: statement
    );
    
  3. Gunakan metode WithParameter yang fasih untuk menetapkan nilai gear-camp-tents ke parameter @partitionKey.

    var parameterizedQuery = query.WithParameter("@partitionKey", "gear-camp-tents");
    
  4. Gunakan Container.GetItemQueryIterator<> untuk mengambil iterator untuk kueri spesifik Anda.

    using FeedIterator<Product> feed = container.GetItemQueryIterator<Product>(
        queryDefinition: parameterizedQuery
    );
    
  5. Tulis kueri ke konsol.

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

Membuat halaman hasil kueri

Azure Cosmos DB secara otomatis memecah hasil kueri Anda menjadi halaman yang dapat diambil secara asinkron. Untuk mengelola halaman ini, Anda perlu menulis kode C# Anda dengan cara tertentu untuk memastikan bahwa Anda mengambil semua halaman hasil yang tersedia. Di sini, Anda akan menggunakan perulangan sementara dan foreach di C# untuk mengulangi semua halaman hasil.

  1. Di Program.cs, buat variabel ganda baru bernama totalRequestCharge yang diatur ke nilai 0.

    double totalRequestCharge = 0d;
    
  2. Buat perulangan sementara yang berulang hingga properti FeedIterator.HasMoreResults dari iterator umpan Anda salah.

    while (feed.HasMoreResults)
    {
    }
    
  3. Di dalam perulangan sementara, dapatkan halaman hasil baru menggunakan metode FeedIterator.ReadNextAsync.

    FeedResponse<Product> page = await feed.ReadNextAsync();
    
  4. Masih di dalam perulangan sementara, tambah total biaya permintaan menggunakan nilai FeedResponse.RequestCharge.

    totalRequestCharge += page.RequestCharge;
    
  5. Masih di dalam perulangan sementara, buat perulangan foreach baru untuk mengulangi item aktual di halaman.

    foreach (Product item in page)
    {
    }
    
  6. Di dalam perulangan foreach, tulis properti id dan nama item yang dikembalikan ke konsol.

    Console.WriteLine($"[Returned item]:\t{item.Id}\t(Name: {item.Name ?? "N/A"})");
    
  7. Di luar perulangan sementara, tulis total biaya permintaan yang Anda hitung ke konsol.

    Console.WriteLine($"[Query metrics]:\t(RUs: {totalRequestCharge})");
    

    Tip

    Jika Anda tidak yakin kode mana yang harus berada di dalam atau di luar perulangan sementara dan foreach, buka bagian kode ulasan di Periksa pekerjaan Anda.

  8. Simpan file Program.cs.

Periksa pekerjaan Anda

Aplikasi Anda sekarang membaca dan mengkueri item dari kontainer. Di sini, Anda menjalankan aplikasi sehingga Anda dapat mengamati hasil kedua operasi.

  1. Jalankan aplikasi .NET di terminal:

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

    ...
    [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)
    

    Tip

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

    Apakah Anda melihat bahwa item kategori Anda berhasil dideserialisasi ke dalam jenis yang Anda gunakan untuk produk? Karena item kategori tidak memiliki properti nama , properti tersebut dibiarkan ke nilai defaultnya. Pemeriksaan jenis, manajemen skema, dan serialisasi/deserialisasi adalah semua hal yang dapat dikelola aplikasi Anda sepenuhnya dari sisi klien.