Uygulamanızı Azure Cosmos DB .NET SDK v3 kullanacak şekilde geçirme

UYGULANANLAR: NoSQL

Önemli

Azure Cosmos DB .NET SDK v3 hakkında bilgi edinmek için Sürüm notları, .NET GitHub deposu, .NET SDK v3 Performans İpuçları ve Sorun Giderme kılavuzuna bakın.

Bu makalede, mevcut .NET uygulamanızı NoSQL için API için daha yeni Azure Cosmos DB .NET SDK v3'e yükseltme konusunda dikkat edilmesi gereken bazı noktalar vurgulanmaktadır. Azure Cosmos DB .NET SDK v3, Microsoft.Azure.Azure Cosmos DB ad alanına karşılık gelir. Uygulamanızı aşağıdaki Azure Cosmos DB .NET SDK'larından herhangi birinden geçiriyorsanız bu belgede sağlanan bilgileri kullanabilirsiniz:

  • NoSQL için API için Azure Cosmos DB .NET Framework SDK v2
  • NoSQL için API için Azure Cosmos DB .NET Core SDK v2

Bu makaledeki yönergeler, artık NoSQL için API için Azure Cosmos DB .NET SDK v3'ün parçası olan aşağıdaki dış kitaplıkları geçirmenize de yardımcı olur:

  • .NET değişiklik akışı işlemci kitaplığı 2.0
  • .NET toplu yürütücü kitaplığı 1.1 veya üzeri

.NET V3 SDK'daki yenilikler

v3 SDK'sı aşağıdakiler dahil olmak üzere birçok kullanılabilirlik ve performans geliştirmesi içerir:

  • Sezgisel programlama modeli adlandırma
  • .NET Standard 2.0 **
  • Akış API'si desteğiyle artan performans
  • URI fabrikası gereksiniminin yerini alan akıcı hiyerarşi
  • Değişiklik akışı işlemci kitaplığı için yerleşik destek
  • Toplu işlemler için yerleşik destek
  • Daha kolay birim testi için sahte API'ler
  • İşlem toplu işlemi ve Blazor desteği
  • Eklenebilir serileştiriciler
  • Bölümlenmemiş kapsayıcıları ölçeklendirme ve otomatik ölçeklendirme

** SDK, mevcut Azure Cosmos DB .NET Framework ve .NET Core SDK'larını tek bir .NET SDK'sı halinde birleştirir. .NET FRAMEWORK 4.6.1+ ve .NET Core 2.0+ uygulamalarınız da dahil olmak üzere .NET Standard 2.0'ı uygulayan herhangi bir platformda .NET SDK'sını kullanabilirsiniz.

SDK'nın ağ, yeniden deneme mantığı ve alt düzeylerinin çoğu büyük ölçüde değişmeden kalır.

Azure Cosmos DB .NET SDK v3 artık açık kaynak. Çekme isteklerini memnuniyetle karşılıyoruz ve sorunları günlüğe kaydetmeye ve GitHub'da geri bildirimleri izlemeye devam edeceğiz. Müşteri deneyimini geliştirecek özellikler üzerinde çalışacağız.

.NET v3 SDK'sına geçiş neden

Çok sayıda kullanılabilirlik ve performans iyileştirmesine ek olarak, en son SDK'da yapılan yeni özellik yatırımları eski sürümlere geri getirilmeyecektir. v2 SDK'sı şu anda bakım modundadır. En iyi geliştirme deneyimi için her zaman SDK'nın desteklenen en son sürümüyle başlamanızı öneririz.

v2 SDK'dan v3 SDK'ya ana ad değişiklikleri

NoSQL api'sinin API adlandırma kurallarıyla uyumlu hale getirmek için .NET 3.0 SDK'sı genelinde aşağıdaki ad değişiklikleri uygulandı:

  • DocumentClient olarak yeniden adlandırıldı CosmosClient
  • Collection olarak yeniden adlandırıldı Container
  • Document olarak yeniden adlandırıldı Item

Tüm kaynak nesneleri, netlik için kaynak adını içeren ek özelliklerle yeniden adlandırılır.

Ana sınıf adı değişikliklerinden bazıları şunlardır:

.NET v2 SDK .NET v3 SDK
Microsoft.Azure.Documents.Client.DocumentClient Microsoft.Azure.Cosmos.CosmosClient
Microsoft.Azure.Documents.Client.ConnectionPolicy Microsoft.Azure.Cosmos.CosmosClientOptions
Microsoft.Azure.Documents.Client.DocumentClientException Microsoft.Azure.Cosmos.CosmosException
Microsoft.Azure.Documents.Client.Database Microsoft.Azure.Cosmos.DatabaseProperties
Microsoft.Azure.Documents.Client.DocumentCollection Microsoft.Azure.Cosmos.ContainerProperties
Microsoft.Azure.Documents.Client.RequestOptions Microsoft.Azure.Cosmos.ItemRequestOptions
Microsoft.Azure.Documents.Client.FeedOptions Microsoft.Azure.Cosmos.QueryRequestOptions
Microsoft.Azure.Documents.Client.StoredProcedure Microsoft.Azure.Cosmos.StoredProcedureProperties
Microsoft.Azure.Documents.Client.Trigger Microsoft.Azure.Cosmos.TriggerProperties
Microsoft.Azure.Documents.SqlQuerySpec Microsoft.Azure.Cosmos.QueryDefinition

.NET v3 SDK'da değiştirilen sınıflar

Aşağıdaki sınıflar 3.0 SDK'sı üzerinde değiştirilmiştir:

  • Microsoft.Azure.Documents.UriFactory

Microsoft.Azure.Documents.UriFactory sınıfının yerini akıcı tasarım almıştır.

Container container = client.GetContainer(databaseName,containerName);
ItemResponse<SalesOrder> response = await this._container.CreateItemAsync(
        salesOrder,
        new PartitionKey(salesOrder.AccountNumber));

  • Microsoft.Azure.Documents.Document

.NET v3 SDK'sı kullanıcıların özel bir serileştirme altyapısı yapılandırmasına izin verdiğinden, türü için Document doğrudan bir değişiklik yoktur. Newtonsoft.Json (varsayılan serileştirme altyapısı) JObject kullanılırken, aynı işlevselliği elde etmek için kullanılabilir. Farklı bir serileştirme altyapısı kullanırken, temel json belge türünü kullanabilirsiniz (örneğin, JsonDocument System.Text.Json için). Öneri, genel türlere güvenmek yerine öğelerinizin şemasını yansıtan bir C# türü kullanmaktır.

  • Microsoft.Azure.Documents.Resource

için doğrudan değiştirme Resourceyoktur, belgeler için kullanıldığı durumlarda için yönergeleri Documentizleyin.

  • Microsoft.Azure.Documents.AccessCondition

IfNoneMatch veya IfMatch artık doğrudan üzerinde Microsoft.Azure.Cosmos.ItemRequestOptions kullanılabilir.

Öğe kimliği oluşturma değişiklikleri

Öğe kimliği artık .NET v3 SDK'sında otomatik olarak doldurulmaz. Bu nedenle, Öğe Kimliği özel olarak oluşturulan bir kimlik içermelidir. Aşağıdaki örneği görüntüleyin:

[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }

Bağlantı modu için varsayılan davranış değiştirildi

SDK v3 artık, varsayılan olarak Gateway + HTTPS bağlantı modları olan önceki v2 SDK'sına kıyasla Doğrudan + TCP bağlantı modları olarak varsayılandır. Bu değişiklik gelişmiş performans ve ölçeklenebilirlik sağlar.

FeedOptions değişiklikleri (v3.0 SDK'sında QueryRequestOptions)

FeedOptions SDK v2'deki sınıfı artık SDK v3'te olarak yeniden adlandırıldı QueryRequestOptions ve sınıfın içinde bazı özelliklerde ad ve/veya varsayılan değerde değişiklikler yapıldı veya tamamen kaldırıldı.

.NET v2 SDK .NET v3 SDK
FeedOptions.MaxDegreeOfParallelism QueryRequestOptions.MaxConcurrency - Varsayılan değer ve ilişkili davranış aynı kalır, paralel sorgu yürütme sırasında istemci tarafı çalıştırılan işlemler paralellik olmadan seri olarak yürütülür.
FeedOptions.PartitionKey QueryRequestOptions.PartitionKey - Davranış korunur.
FeedOptions.EnableCrossPartitionQuery Kaldırıldı. SDK 3.0'daki varsayılan davranış, bölümler arası sorguların özelliği özellikle etkinleştirmeye gerek kalmadan yürütülmesidir.
FeedOptions.PopulateQueryMetrics Kaldırıldı. Artık varsayılan olarak ve tanılamanın bir parçası olarak etkinleştirilir.
FeedOptions.RequestContinuation Kaldırıldı. Artık sorgu yöntemlerine yükseltilir.
FeedOptions.JsonSerializerSettings Kaldırıldı. Daha fazla bilgi için serileştirmeyi özelleştirme bölümüne bakın.
FeedOptions.PartitionKeyRangeId Kaldırıldı. Aynı sonuç, sorgu yöntemine giriş olarak FeedRange kullanılarak elde edilebilir.
FeedOptions.DisableRUPerMinuteUsage Kaldırıldı.

İstemci oluşturma

.NET SDK v3, SDK v2 URI Factory gereksiniminin yerini alan akıcı CosmosClientBuilder bir sınıf sağlar.

Akıcı tasarım, URL'leri dahili olarak oluşturur ve , DatabaseNameve DocumentCollectionyerine tek Container bir DocumentClientnesnenin geçirilmesine izin verir.

Aşağıdaki örnek güçlü bir ConsistencyLevel ile yeni CosmosClientBuilder bir ve tercih edilen konumların listesini oluşturur:

CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder(
    accountEndpoint: "https://testcosmos.documents.azure.com:443/",
    authKeyOrResourceToken: "SuperSecretKey")
.WithConsistencyLevel(ConsistencyLevel.Strong)
.WithApplicationRegion(Regions.EastUS);
CosmosClient client = cosmosClientBuilder.Build();

Özel durumlar

v2 SDK'sı işlemler sırasında hataların sinyalini almak için kullanıldığındaDocumentClientException, v3 SDK'sı StatusCode, Diagnosticsve yanıtla ilgili diğer bilgileri kullanıma sunan öğesini kullanırCosmosException. Tüm bilgiler kullanıldığında seri hale getirilir ToString() :

catch (CosmosException ex)
{
    HttpStatusCode statusCode = ex.StatusCode;
    CosmosDiagnostics diagnostics = ex.Diagnostics;
    // store diagnostics optionally with diagnostics.ToString();
    // or log the entire error details with ex.ToString();
}

Tanılama

v2 SDK'sının özelliği aracılığıyla RequestDiagnosticsString yalnızca doğrudan tanılamaya sahip olduğu durumlarda, v3 SDK'sı daha zengin olan ve Doğrudan modla sınırlı olmayan tüm yanıtlarda ve özel durumlarda kullanılabilir.Diagnostics Bunlar yalnızca işlem için SDK'da harcanan zamanı değil, aynı zamanda işlemin iletişim kurduğu bölgeleri de içerir:

try
{
    ItemResponse<MyItem> response = await container.ReadItemAsync<MyItem>(
                    partitionKey: new PartitionKey("MyPartitionKey"),
                    id: "MyId");
    
    TimeSpan elapsedTime = response.Diagnostics.GetElapsedTime();
    if (elapsedTime > somePreDefinedThreshold)
    {
        // log response.Diagnostics.ToString();
        IReadOnlyList<(string region, Uri uri)> regions = response.Diagnostics.GetContactedRegions();
    }
}
catch (CosmosException cosmosException) {
    string diagnostics = cosmosException.Diagnostics.ToString();
    
    TimeSpan elapsedTime = cosmosException.Diagnostics.GetElapsedTime();
    
    IReadOnlyList<(string region, Uri uri)> regions = cosmosException.Diagnostics.GetContactedRegions();
    
    // log cosmosException.ToString()
}

Bağlan ionPolicy

içindeki ConnectionPolicy bazı ayarlar tarafından CosmosClientOptionsyeniden adlandırıldı veya değiştirildi:

.NET v2 SDK .NET v3 SDK
EnableEndpointDiscovery LimitToEndpoint- Değer artık tersine çevrildi, olarak ayarlanıyorsa EnableEndpointDiscoverytrueLimitToEndpoint olarak ayarlanmalıdırfalse. Bu ayarı kullanmadan önce istemciyi nasıl etkilediğini anlamanız gerekir.
ConnectionProtocol Kaldırıldı. Protokol, Ağ Geçidi (HTTPS) veya Doğrudan (TCP) olmak üzere Moda bağlıdır. HTTPS protokolüne sahip doğrudan mod artık V3 SDK'da desteklenmediğinden TCP protokolü kullanılması önerilir.
MediaRequestTimeout Kaldırıldı. Ekler artık desteklenmiyor.
SetCurrentLocation CosmosClientOptions.ApplicationRegion aynı etkiyi elde etmek için kullanılabilir.
PreferredLocations CosmosClientOptions.ApplicationPreferredRegions aynı etkiyi elde etmek için kullanılabilir.
UserAgentSuffix CosmosClientBuilder.ApplicationName aynı etkiyi elde etmek için kullanılabilir.
UseMultipleWriteLocations Kaldırıldı. SDK, hesabın birden çok yazma uç noktasını desteklediğini otomatik olarak algılar.

Dizin oluşturma ilkesi

Dizin oluşturma ilkesinde bu özellikleri yapılandırmak mümkün değildir. Belirtilmediğinde, bu özellikler artık her zaman aşağıdaki değerlere sahip olacaktır:

Özellik Adı Yeni Değer (yapılandırılamaz)
Kind range
dataType String ve Number

Yolları dahil etme ve dışlama için dizin oluşturma ilkesi örnekleri için bu bölüme bakın. Sorgu altyapısındaki geliştirmeler nedeniyle, eski bir SDK sürümü kullansa bile bu özelliklerin yapılandırılması performansı etkilemez.

Oturum belirteci

v2 SDK'sı, oturum belirtecini yakalamanın gerekli olduğu durumlarda olduğu gibi ResourceResponse.SessionToken bir yanıtın oturum belirtecini kullanıma sunarken, oturum belirteci bir üst bilgi olduğundan, v3 SDK bu değeri herhangi bir yanıtın özelliğinde Headers.Session kullanıma sunar.

Zaman damgası

v2 SDK'sının özelliği aracılığıyla belgenin zaman damgasını Timestamp ortaya çıkardığı durumlarda, Document kullanıcılar artık kullanılamadığından sistem özelliğini modellerindeki bir özelliğe eşleyebilir_ts.

OpenAsync

v2 SDK istemcisini ısıtmak için kullanılan kullanım örnekleri OpenAsync() için bir CreateAndInitializeAsync v3 SDK istemcisi oluşturmak ve ısıtmak için kullanılabilir.

Değişiklik akışı işlemci API'lerini doğrudan v3 SDK'dan kullanma

v3 SDK'sı, Değişiklik Akışı İşlemcisi API'leri için yerleşik desteğe sahiptir ve uygulamanızı oluşturmak ve değişiklik akışı işlemcisi uygulamasını oluşturmak için aynı SDK'yı kullanmanıza olanak sağlar. Daha önce ayrı bir değişiklik akışı işlemci kitaplığı kullanmanız gerekiyordu.

Daha fazla bilgi için bkz . Değişiklik akışı işlemci kitaplığından Azure Cosmos DB .NET v3 SDK'sına geçiş

Akış sorgularını değiştirme

v3 SDK'sı üzerinde değişiklik akışı sorgularının yürütülmesi, değişiklik akışı çekme modelinin kullanıldığı kabul edilir. Yapılandırmayı geçirmek için şu tabloyu izleyin:

.NET v2 SDK .NET v3 SDK
ChangeFeedOptions.PartitionKeyRangeId FeedRange - Paralellik elde etmek için değişiklik akışını okumak için FeedRanges kullanılabilir. Artık gerekli bir parametre değildir. Artık kapsayıcının tamamı için Değişiklik Akışını kolayca okuyabilirsiniz.
ChangeFeedOptions.PartitionKey FeedRange.FromPartitionKey- İstenen Bölüm Anahtarını temsil eden bir FeedRange, bu Bölüm Anahtarı değerinin Değişiklik Akışını okumak için kullanılabilir.
ChangeFeedOptions.RequestContinuation ChangeFeedStartFrom.Continuation - Değişiklik akışı yineleyicisi, devamlılık kaydedilerek ve yeni yineleyici oluşturulurken kullanılarak istediğiniz zaman durdurulabilir ve sürdürülebilir.
ChangeFeedOptions.StartTime ChangeFeedStartFrom.Time
ChangeFeedOptions.StartFromBeginning ChangeFeedStartFrom.Beginning
ChangeFeedOptions.MaxItemCount ChangeFeedRequestOptions.PageSizeHint - Değişiklik akışı yineleyicisi, devamlılık kaydedilerek ve yeni yineleyici oluşturulurken kullanılarak istediğiniz zaman durdurulabilir ve sürdürülebilir.
IDocumentQuery.HasMoreResults response.StatusCode == HttpStatusCode.NotModified - Değişiklik akışı kavramsal olarak sonsuzdur, bu nedenle her zaman daha fazla sonuç olabilir. Yanıt durum kodunu içerdiğinde HttpStatusCode.NotModified , şu anda okunacak yeni bir değişiklik olmadığı anlamına gelir. Bunu kullanarak devamlılığı durdurabilir ve kaydedebilir ya da geçici olarak uyku moduna alabilir ya da bekleyip yeniden arayarak ReadNextAsync yeni değişiklikleri test edebilirsiniz.
Bölme işleme Kullanıcıların değişiklik akışını okurken bölünmüş özel durumları işlemesi artık gerekli değildir; bölmeler kullanıcı etkileşimi gerekmeden saydam bir şekilde işlenir.

Toplu yürütücü kitaplığını doğrudan V3 SDK'dan kullanma

v3 SDK'sı, toplu yürütücü kitaplığı için yerleşik desteğe sahiptir ve uygulamanızı derlemek ve toplu işlemler gerçekleştirmek için aynı SDK'yı kullanmanıza olanak sağlar. Daha önce ayrı bir toplu yürütücü kitaplığı kullanmanız gerekiyordu.

Daha fazla bilgi için bkz . Azure Cosmos DB .NET V3 SDK'sında toplu destek için toplu yürütücü kitaplığından geçiş yapma

Serileştirmeyi özelleştirme

.NET V2 SDK'sı, RequestOptions'ta JsonSerializer Ayarlar sonuç belgesinin seri durumdan çıkarılması için kullanılan işlem düzeyinde ayarlanmasına olanak tanır:

// .NET V2 SDK
var result = await container.ReplaceDocumentAsync(document, new RequestOptions { JsonSerializerSettings = customSerializerSettings })

.NET SDK v3, serileştirme altyapısını tamamen özelleştirmek için bir seri hale getirici arabirimi veya istemci yapısının bir parçası olarak daha genel serileştirme seçenekleri sağlar.

İşlem düzeyinde serileştirmeyi özelleştirmek, Stream API'lerinin kullanımıyla elde edilebilir:

// .NET V3 SDK
using(Response response = await this.container.ReplaceItemStreamAsync(stream, "itemId", new PartitionKey("itemPartitionKey"))
{

    using(Stream stream = response.ContentStream)
    {
        using (StreamReader streamReader = new StreamReader(stream))
        {
            // Read the stream and do dynamic deserialization based on type with a custom Serializer
        }
    }
}

Kod parçacığı karşılaştırmaları

Aşağıdaki kod parçacığı, .NET v2 ve v3 SDK'ları arasında kaynakların nasıl oluşturulduğundaki farkları gösterir:

Veritabanı işlemleri

veritabanı oluşturun

// Create database with no shared provisioned throughput
DatabaseResponse databaseResponse = await client.CreateDatabaseIfNotExistsAsync(DatabaseName);
Database database = databaseResponse;
DatabaseProperties databaseProperties = databaseResponse;

// Create a database with a shared manual provisioned throughput
string databaseIdManual = new string(DatabaseName + "_SharedManualThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdManual, ThroughputProperties.CreateManualThroughput(400));

// Create a database with shared autoscale provisioned throughput
string databaseIdAutoscale = new string(DatabaseName + "_SharedAutoscaleThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdAutoscale, ThroughputProperties.CreateAutoscaleThroughput(4000));

Kimliğe göre veritabanını okuma

// Read a database
Console.WriteLine($"{Environment.NewLine} Read database resource: {DatabaseName}");
database = client.GetDatabase(DatabaseName);
Console.WriteLine($"{Environment.NewLine} database { database.Id.ToString()}");

// Read all databases
string findQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(findQueryText))
{
    while (feedIterator.HasMoreResults)
    {
        FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
        foreach (DatabaseProperties _database in databaseResponses)
        {
            Console.WriteLine($"{ Environment.NewLine} database {_database.Id.ToString()}");
        }
    }
}

Veritabanı silme

// Delete a database
await client.GetDatabase(DatabaseName).DeleteAsync();
Console.WriteLine($"{ Environment.NewLine} database {DatabaseName} deleted.");

// Delete all databases in an account
string deleteQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(deleteQueryText))
{
    while (feedIterator.HasMoreResults)
    {
        FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
        foreach (DatabaseProperties _database in databaseResponses)
        {
            await client.GetDatabase(_database.Id).DeleteAsync();
            Console.WriteLine($"{ Environment.NewLine} database {_database.Id} deleted");
        }
    }
}

Kapsayıcı işlemleri

Kapsayıcı oluşturma (Otomatik Ölçeklendirme + Süre sonu ile yaşam süresi)

private static async Task CreateManualThroughputContainer(Database database)
{
    // Set throughput to the minimum value of 400 RU/s manually configured throughput
    string containerIdManual = ContainerName + "_Manual";
    ContainerResponse container = await database.CreateContainerIfNotExistsAsync(
        id: containerIdManual,
        partitionKeyPath: partitionKeyPath,
        throughput: 400);
}

// Create container with autoscale
private static async Task CreateAutoscaleThroughputContainer(Database database)
{
    string autoscaleContainerId = ContainerName + "_Autoscale";
    ContainerProperties containerProperties = new ContainerProperties(autoscaleContainerId, partitionKeyPath);

    Container container = await database.CreateContainerIfNotExistsAsync(
        containerProperties: containerProperties,
        throughputProperties: ThroughputProperties.CreateAutoscaleThroughput(autoscaleMaxThroughput: 4000);
}

// Create a container with TTL Expiration
private static async Task CreateContainerWithTtlExpiration(Database database)
{
    string containerIdManualwithTTL = ContainerName + "_ManualTTL";

    ContainerProperties properties = new ContainerProperties
        (id: containerIdManualwithTTL,
        partitionKeyPath: partitionKeyPath);

    properties.DefaultTimeToLive = (int)TimeSpan.FromDays(1).TotalSeconds; //expire in 1 day

    ContainerResponse containerResponse = await database.CreateContainerIfNotExistsAsync(containerProperties: properties);
    ContainerProperties returnedProperties = containerResponse;
}

Kapsayıcı özelliklerini okuma

private static async Task ReadContainerProperties(Database database)
{
    string containerIdManual = ContainerName + "_Manual";
    Container container = database.GetContainer(containerIdManual);
    ContainerProperties containerProperties = await container.ReadContainerAsync();
}

Kapsayıcı silme

private static async Task DeleteContainers(Database database)
{
    string containerIdManual = ContainerName + "_Manual";

    // Delete a container
    await database.GetContainer(containerIdManual).DeleteContainerAsync();

    // Delete all CosmosContainer resources for a database
    using (FeedIterator<ContainerProperties> feedIterator = database.GetContainerQueryIterator<ContainerProperties>())
    {
        while (feedIterator.HasMoreResults)
        {
            foreach (ContainerProperties _container in await feedIterator.ReadNextAsync())
            {
                await database.GetContainer(_container.Id).DeleteContainerAsync();
                Console.WriteLine($"{Environment.NewLine}  deleted container {_container.Id}");
            }
        }
    }
}

Öğe ve sorgu işlemleri

Öğe oluşturma

private static async Task CreateItemAsync(Container container)
{
    // Create a SalesOrder POCO object
    SalesOrder salesOrder1 = GetSalesOrderSample("Account1", "SalesOrder1");
    ItemResponse<SalesOrder> response = await container.CreateItemAsync(salesOrder1,
        new PartitionKey(salesOrder1.AccountNumber));
}

private static async Task RunBasicOperationsOnDynamicObjects(Container container)
{
    // Dynamic Object
    dynamic salesOrder = new
    {
        id = "SalesOrder5",
        AccountNumber = "Account1",
        PurchaseOrderNumber = "PO18009186470",
        OrderDate = DateTime.UtcNow,
        Total = 5.95,
    };
    Console.WriteLine("\nCreating item");
    ItemResponse<dynamic> response = await container.CreateItemAsync<dynamic>(
        salesOrder, new PartitionKey(salesOrder.AccountNumber));
    dynamic createdSalesOrder = response.Resource;
}

Kapsayıcıdaki tüm öğeleri okuma

private static async Task ReadAllItems(Container container)
{
    // Read all items in a container
    List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();

    using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
        queryDefinition: null,
        requestOptions: new QueryRequestOptions()
        {
            PartitionKey = new PartitionKey("Account1"),
            MaxItemCount = 5
        }))
    {
        while (resultSet.HasMoreResults)
        {
            FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
            SalesOrder salesOrder = response.First();
            Console.WriteLine($"\n1.3.1 Account Number: {salesOrder.AccountNumber}; Id: {salesOrder.Id}");
            allSalesForAccount1.AddRange(response);
        }
    }
}

Sorgu öğeleri

SqlQuerySpec'teki değişiklikler (v3.0 SDK'da QueryDefinition)

SqlQuerySpec SDK v2'deki sınıf artık SDK v3'te olarak yeniden adlandırıldıQueryDefinition.

SqlParameterCollection ve SqlParameter kaldırıldı. Parametreler artık kullanılarak QueryDefinition.WithParameteroluşturucu modeli ile öğesine QueryDefinition eklenir. Kullanıcılar ile parametrelere erişebilir QueryDefinition.GetQueryParameters

private static async Task QueryItems(Container container)
{
    // Query for items by a property other than Id
    QueryDefinition queryDefinition = new QueryDefinition(
        "select * from sales s where s.AccountNumber = @AccountInput")
        .WithParameter("@AccountInput", "Account1");

    List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();
    using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
        queryDefinition,
        requestOptions: new QueryRequestOptions()
        {
            PartitionKey = new PartitionKey("Account1"),
            MaxItemCount = 1
        }))
    {
        while (resultSet.HasMoreResults)
        {
            FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
            SalesOrder sale = response.First();
            Console.WriteLine($"\n Account Number: {sale.AccountNumber}; Id: {sale.Id};");
            allSalesForAccount1.AddRange(response);
        }
    }
}

Öğeyi silme

private static async Task DeleteItemAsync(Container container)
{
    ItemResponse<SalesOrder> response = await container.DeleteItemAsync<SalesOrder>(
        partitionKey: new PartitionKey("Account1"), id: "SalesOrder3");
}

Değişiklik akışı sorgusu

private static async Task QueryChangeFeedAsync(Container container)
{
    FeedIterator<SalesOrder> iterator = container.GetChangeFeedIterator<SalesOrder>(ChangeFeedStartFrom.Beginning(), ChangeFeedMode.Incremental);

    string continuation = null;
    while (iterator.HasMoreResults)
    {
        FeedResponse<SalesOrder> response = await iteratorForTheEntireContainer.ReadNextAsync();
    
        if (response.StatusCode == HttpStatusCode.NotModified)
        {
            // No new changes
            continuation = response.ContinuationToken;
            break;
        }
        else 
        {
            // Process the documents in response
        }
    }
}

Sonraki adımlar