Kladde.Verlauf zeigt den Büros ihre Termine: den Kalender eines Monats, einen einzelnen Termin, später einen Aktivitätsfeed. Die Daten liegen im Container appointments, hierarchisch partitioniert nach /officeId und /month (K3, Lektion 3.6.4 und Lektion 1.4). Diese Lektion fragt, wie man sie wieder herausbekommt: mit dem Punktlesen, mit Abfragen und mit Seiten, wenn ein Ergebnis nicht auf einmal kommt.

Nicht gegen Azure ausgeführt. Der Code wurde mit Microsoft.Azure.Cosmos 3.64.0 und Newtonsoft.Json 13.0.4 übersetzt; gelaufen ist nur der Teil mit der Attrappe (Übung 1). Gegen ein Konto oder den Emulator wurde nichts ausgeführt. Was die Lektion über Verbrauch und Verhalten des Dienstes sagt, stammt aus Microsoft Learn, gelesen am Tag des Schreibens.

Punktlesen: der billigste Weg

Ein Punktlesen (ReadItemAsync) braucht id und den vollständigen Partitionsschlüssel. Learn nennt die Rangfolge der Lesewege vom günstigsten zum teuersten: Punktlesen, Abfrage mit Filter innerhalb eines Partitionsschlüssels, Abfrage ohne Gleichheits- oder Bereichsfilter, Abfrage ganz ohne Filter. Ein Element von 1 KB kostet beim Punktlesen 1 RU, eines von 100 KB etwa 10 RU; außer der Größe (und dem doppelten Aufschlag bei Strong und Bounded Staleness, K3 Lektion 3.6.4) beeinflusst nichts die Kosten.

Eine Falle: Eine Abfrage mit id und vollem Schlüssel im WHERE ist laut Learn kein Punktlesen, auch wenn sie dasselbe Element trifft. Daraus folgt eine Entwurfsregel: Geben Sie Elementen eine id, die sich ohne Suche ergibt (die Terminnummer), damit Sie lesen statt abfragen können. Fehlt das Element, antwortet der Dienst mit 404, und das SDK wirft eine CosmosException:

C#
ItemResponse<Appointment> response = await container.ReadItemAsync<Appointment>(
    id, new PartitionKeyBuilder().Add(officeId).Add(month).Build());
Console.WriteLine(response.RequestCharge);   // the cost of this read in RU