Uw toepassing migreren om de Azure Cosmos DB .NET SDK v3 te gebruiken
VAN TOEPASSING OP: NoSQL
Belangrijk
Zie de releaseopmerkingen, de .NET GitHub-opslagplaats, .NET SDK v3 Prestatietips en de gids voor probleemoplossing voor meer informatie over de Azure Cosmos DB .NET SDK v3 v3.
In dit artikel worden enkele overwegingen beschreven voor het upgraden van uw bestaande .NET-toepassing naar de nieuwere Azure Cosmos DB .NET SDK v3 for API for NoSQL. Azure Cosmos DB .NET SDK v3 komt overeen met de microsoft.Azure.Azure Cosmos DB-naamruimte. U kunt de informatie in dit document gebruiken als u uw toepassing migreert vanuit een van de volgende Azure Cosmos DB .NET SDK's:
- Azure Cosmos DB .NET Framework SDK v2 for API for NoSQL
- Azure Cosmos DB .NET Core SDK v2 for API for NoSQL
De instructies in dit artikel helpen u ook bij het migreren van de volgende externe bibliotheken die nu deel uitmaken van de Azure Cosmos DB .NET SDK v3 for API for NoSQL:
- .NET-processorbibliotheek voor wijzigingenfeed 2.0
- .NET bulkexecutorbibliotheek 1.1 of hoger
Wat is er nieuw in de .NET V3 SDK
De v3 SDK bevat veel bruikbaarheids- en prestatieverbeteringen, waaronder:
- Naamgeving van intuïtief programmeermodel
- .NET Standard 2.0 **
- Verbeterde prestaties via stream-API-ondersteuning
- Fluent-hiërarchie die de behoefte aan URI-factory vervangt
- Ingebouwde ondersteuning voor de processorbibliotheek voor wijzigingenfeeds
- Ingebouwde ondersteuning voor bulkbewerkingen
- Mockable API's voor eenvoudigere eenheidstests
- Transactionele batch- en Blazor-ondersteuning
- Pluggable serializers
- Containers die niet zijn gepartitioneerd en automatisch schalen
** De SDK is gericht op .NET Standard 2.0 waarmee de bestaande Azure Cosmos DB .NET Framework- en .NET Core SDK's worden samengevoegd tot één .NET SDK. U kunt de .NET SDK gebruiken in elk platform dat .NET Standard 2.0 implementeert, inclusief uw .NET Framework 4.6.1+ en .NET Core 2.0+-toepassingen.
De meeste netwerken, logica voor opnieuw proberen en lagere niveaus van de SDK blijven grotendeels ongewijzigd.
De Azure Cosmos DB .NET SDK v3 is nu open source. We verwelkomen alle pull-aanvragen en registreren problemen en het bijhouden van feedback op GitHub. We werken aan het overnemen van functies die de klantervaring verbeteren.
Waarom migreren naar de .NET v3 SDK
Naast de talloze bruikbaarheids- en prestatieverbeteringen, worden nieuwe functie-investeringen in de nieuwste SDK niet teruggezet naar oudere versies. De v2 SDK bevindt zich momenteel in de onderhoudsmodus. Voor de beste ontwikkelervaring raden we u aan altijd te beginnen met de nieuwste ondersteunde versie van SDK.
Belangrijke naamwijzigingen van v2 SDK naar v3 SDK
De volgende naamwijzigingen zijn toegepast in de .NET 3.0 SDK, zodat deze overeenkomt met de API-naamconventies voor de API voor NoSQL:
DocumentClient
is hernoemd inCosmosClient
Collection
is hernoemd inContainer
Document
is hernoemd inItem
Alle resourceobjecten worden hernoemd met aanvullende eigenschappen, waaronder de resourcenaam ter duidelijkheid.
Hier volgen enkele wijzigingen in de naam van de hoofdklasse:
.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 |
Klassen vervangen in .NET v3 SDK
De volgende klassen zijn vervangen in de 3.0 SDK:
Microsoft.Azure.Documents.UriFactory
De klasse Microsoft.Azure.Documents.UriFactory is vervangen door het vloeiende ontwerp.
Container container = client.GetContainer(databaseName,containerName);
ItemResponse<SalesOrder> response = await this._container.CreateItemAsync(
salesOrder,
new PartitionKey(salesOrder.AccountNumber));
Microsoft.Azure.Documents.Document
Omdat met de .NET v3 SDK gebruikers een aangepaste serialisatie-engine kunnen configureren, is er geen directe vervanging voor het Document
type. Wanneer u Newtonsoft.Json (standaardserialisatie-engine) gebruikt, JObject
kunt u dezelfde functionaliteit bereiken. Wanneer u een andere serialisatie-engine gebruikt, kunt u het JSON-basisdocumenttype (bijvoorbeeld JsonDocument
voor System.Text.Json) gebruiken. De aanbeveling is om een C#-type te gebruiken dat het schema van uw items weerspiegelt in plaats van te vertrouwen op algemene typen.
Microsoft.Azure.Documents.Resource
Er is geen directe vervanging voor Resource
, in gevallen waarin het voor documenten is gebruikt, volgt u de richtlijnen voor Document
.
Microsoft.Azure.Documents.AccessCondition
IfNoneMatch
of IfMatch
zijn nu rechtstreeks beschikbaar op de Microsoft.Azure.Cosmos.ItemRequestOptions
pagina.
Wijzigingen in het genereren van item-id's
Item-id wordt niet meer automatisch ingevuld in de .NET v3 SDK. Daarom moet de item-id specifiek een gegenereerde id bevatten. Bekijk het volgende voorbeeld:
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
Standaardgedrag voor verbindingsmodus gewijzigd
De SDK v3 is nu standaard ingesteld op Direct + TCP-verbindingsmodi in vergelijking met de vorige v2 SDK, die standaard is ingesteld op gateway + HTTPS-verbindingsmodi. Deze wijziging biedt verbeterde prestaties en schaalbaarheid.
Wijzigingen in FeedOptions (QueryRequestOptions in v3.0 SDK)
De FeedOptions
klasse in SDK v2 is nu gewijzigd QueryRequestOptions
in de SDK v3 en binnen de klasse zijn verschillende eigenschappen gewijzigd in de naam en/of standaardwaarde of zijn volledig verwijderd.
.NET v2 SDK | .NET v3 SDK |
---|---|
FeedOptions.MaxDegreeOfParallelism |
QueryRequestOptions.MaxConcurrency - De standaardwaarde en het bijbehorende gedrag blijven hetzelfde, bewerkingen die worden uitgevoerd aan de clientzijde tijdens parallelle uitvoering van query's, worden serieel uitgevoerd zonder parallelle uitvoering. |
FeedOptions.PartitionKey |
QueryRequestOptions.PartitionKey - Gedrag gehandhaafd. |
FeedOptions.EnableCrossPartitionQuery |
Verwijderd. Standaardgedrag in SDK 3.0 is dat query's tussen partities worden uitgevoerd zonder dat de eigenschap specifiek hoeft te worden ingeschakeld. |
FeedOptions.PopulateQueryMetrics |
Verwijderd. Deze is nu standaard ingeschakeld en maakt deel uit van de diagnostische gegevens. |
FeedOptions.RequestContinuation |
Verwijderd. Het wordt nu gepromoveerd naar de querymethoden zelf. |
FeedOptions.JsonSerializerSettings |
Verwijderd. Zie hoe u serialisatie aanpast voor aanvullende informatie. |
FeedOptions.PartitionKeyRangeId |
Verwijderd. Hetzelfde resultaat kan worden verkregen van het gebruik van FeedRange als invoer voor de querymethode. |
FeedOptions.DisableRUPerMinuteUsage |
Verwijderd. |
Een client maken
De .NET SDK v3 biedt een fluent-klasse CosmosClientBuilder
die de noodzaak voor de SDK v2 URI Factory vervangt.
Met het fluent-ontwerp worden URL's intern gebouwd en kan één Container
object worden doorgegeven in plaats van een DocumentClient
, DatabaseName
en DocumentCollection
.
In het volgende voorbeeld wordt een nieuwe CosmosClientBuilder
gemaakt met een sterk ConsistencyLevel en een lijst met voorkeurslocaties:
CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder(
accountEndpoint: "https://testcosmos.documents.azure.com:443/",
authKeyOrResourceToken: "SuperSecretKey")
.WithConsistencyLevel(ConsistencyLevel.Strong)
.WithApplicationRegion(Regions.EastUS);
CosmosClient client = cosmosClientBuilder.Build();
Uitzonderingen
Waar de v2 SDK die wordt gebruikt DocumentClientException
om fouten tijdens bewerkingen aan te geven, gebruikt CosmosException
de v3 SDK , die de StatusCode
, Diagnostics
en andere antwoordgerelateerde informatie weergeeft. Alle volledige informatie wordt geserialiseerd wanneer ToString()
deze wordt gebruikt:
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();
}
Diagnostiek
Waar de v2 SDK alleen-directe diagnostische gegevens beschikbaar had via de RequestDiagnosticsString
eigenschap, gebruikt de v3 SDK alle Diagnostics
antwoorden en uitzonderingen, die uitgebreider zijn en niet beperkt zijn tot de directe modus. Ze omvatten niet alleen de tijd die is besteed aan de SDK voor de bewerking, maar ook de regio's met wie contact is opgenomen:
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()
}
ConnectionPolicy
Sommige instellingen in ConnectionPolicy
zijn hernoemd of vervangen door CosmosClientOptions
:
.NET v2 SDK | .NET v3 SDK |
---|---|
EnableEndpointDiscovery |
LimitToEndpoint - De waarde wordt nu omgekeerd, als EnableEndpointDiscovery deze is ingesteld op true , LimitToEndpoint moet worden ingesteld op false . Voordat u deze instelling gebruikt, moet u weten hoe deze van invloed is op de client. |
ConnectionProtocol |
Verwijderd. Protocol is gekoppeld aan de modus, ofwel gateway (HTTPS) of Direct (TCP). De directe modus met het HTTPS-protocol wordt niet meer ondersteund in V3 SDK en het wordt aanbevolen TCP-protocol te gebruiken. |
MediaRequestTimeout |
Verwijderd. Bijlagen worden niet meer ondersteund. |
SetCurrentLocation |
CosmosClientOptions.ApplicationRegion kan worden gebruikt om hetzelfde effect te bereiken. |
PreferredLocations |
CosmosClientOptions.ApplicationPreferredRegions kan worden gebruikt om hetzelfde effect te bereiken. |
UserAgentSuffix |
CosmosClientBuilder.ApplicationName kan worden gebruikt om hetzelfde effect te bereiken. |
UseMultipleWriteLocations |
Verwijderd. De SDK detecteert automatisch of het account ondersteuning biedt voor meerdere schrijfeindpunten. |
Indexeringsbeleid
In het indexeringsbeleid is het niet mogelijk om deze eigenschappen te configureren. Wanneer deze niet zijn opgegeven, hebben deze eigenschappen nu altijd de volgende waarden:
Naam van eigenschap | Nieuwe waarde (niet configureerbaar) |
---|---|
Kind |
range |
dataType |
String en Number |
Zie deze sectie voor voorbeelden van indexeringsbeleid voor het opnemen en uitsluiten van paden. Vanwege verbeteringen in de query-engine heeft het configureren van deze eigenschappen, zelfs als u een oudere SDK-versie gebruikt, geen invloed op de prestaties.
Sessietoken
Waar de v2 SDK het sessietoken van een antwoord beschikbaar heeft gesteld voor ResourceResponse.SessionToken
gevallen waarin het vastleggen van het sessietoken vereist was, omdat het sessietoken een header is, toont de v3 SDK die waarde in de Headers.Session
eigenschap van een antwoord.
Tijdstempel
Waar de v2 SDK de tijdstempel van een document via de Timestamp
eigenschap beschikbaar heeft gesteld, omdat Document
ze niet meer beschikbaar zijn, kunnen gebruikers de _ts
systeemeigenschap toewijzen aan een eigenschap in hun model.
OpenAsync
Voor gebruiksscenario's waarbij OpenAsync()
de v2 SDK-client werd opgewarmd, CreateAndInitializeAsync
kan worden gebruikt om zowel een v3 SDK-client te maken als op te warmen .
De processor-API's van de wijzigingenfeed rechtstreeks gebruiken vanuit de v3 SDK
De v3 SDK heeft ingebouwde ondersteuning voor de API's voor wijzigingenfeedprocessor, zodat u dezelfde SDK kunt gebruiken voor het bouwen van uw toepassing en implementatie van de wijzigingenfeedprocessor. Voorheen moest u een afzonderlijke processorbibliotheek voor wijzigingenfeeds gebruiken.
Zie voor meer informatie hoe u migreert van de processorbibliotheek van de wijzigingenfeed naar de Azure Cosmos DB .NET v3 SDK
Query's voor wijzigingenfeed
Het uitvoeren van query's voor wijzigingenfeeds op de v3 SDK wordt beschouwd als het gebruik van het pull-model voor de wijzigingenfeed. Volg deze tabel om de configuratie te migreren:
.NET v2 SDK | .NET v3 SDK |
---|---|
ChangeFeedOptions.PartitionKeyRangeId |
FeedRange - Om parallellisme te bereiken dat de FeedRanges voor wijzigingenfeeds kan worden gelezen, kan worden gebruikt. Het is geen vereiste parameter meer. U kunt de wijzigingenfeed nu eenvoudig lezen voor een hele container . |
ChangeFeedOptions.PartitionKey |
FeedRange.FromPartitionKey - Een FeedRange die de gewenste partitiesleutel vertegenwoordigt, kan worden gebruikt om de wijzigingenfeed voor die partitiesleutelwaarde te lezen. |
ChangeFeedOptions.RequestContinuation |
ChangeFeedStartFrom.Continuation - De iterator van de wijzigingenfeed kan op elk gewenst moment worden gestopt en hervat door de voortzetting op te slaan en te gebruiken bij het maken van een nieuwe iterator. |
ChangeFeedOptions.StartTime |
ChangeFeedStartFrom.Time |
ChangeFeedOptions.StartFromBeginning |
ChangeFeedStartFrom.Beginning |
ChangeFeedOptions.MaxItemCount |
ChangeFeedRequestOptions.PageSizeHint - De iterator van de wijzigingenfeed kan op elk gewenst moment worden gestopt en hervat door de voortzetting op te slaan en te gebruiken bij het maken van een nieuwe iterator. |
IDocumentQuery.HasMoreResults |
response.StatusCode == HttpStatusCode.NotModified - De wijzigingenfeed is conceptueel oneindig, dus er kunnen altijd meer resultaten zijn. Wanneer een antwoord de HttpStatusCode.NotModified statuscode bevat, betekent dit dat er op dit moment geen nieuwe wijzigingen zijn om te lezen. U kunt dit gebruiken om de voortzetting te stoppen en op te slaan of tijdelijk te slapen of te wachten en vervolgens opnieuw aan te roepen ReadNextAsync om te testen op nieuwe wijzigingen. |
Split handling | Het is niet meer nodig voor gebruikers om gesplitste uitzonderingen af te handelen bij het lezen van de wijzigingenfeed. Splitsingen worden transparant afgehandeld zonder tussenkomst van de gebruiker. |
De bulkexecutorbibliotheek rechtstreeks vanuit de V3 SDK gebruiken
De v3 SDK biedt ingebouwde ondersteuning voor de bulkexecutorbibliotheek, zodat u dezelfde SDK kunt gebruiken voor het bouwen van uw toepassing en het uitvoeren van bulkbewerkingen. Voorheen moest u een afzonderlijke bulkexecutorbibliotheek gebruiken.
Zie voor meer informatie hoe u migreert van de bulkexecutorbibliotheek naar bulkondersteuning in Azure Cosmos DB .NET V3 SDK
Serialisatie aanpassen
Met de .NET V2 SDK kunt u JsonSerializerSettings instellen in RequestOptions op operationeel niveau dat wordt gebruikt om het resultaatdocument te deserialiseren:
// .NET V2 SDK
var result = await container.ReplaceDocumentAsync(document, new RequestOptions { JsonSerializerSettings = customSerializerSettings })
De .NET SDK v3 biedt een serialisatie-interface voor het volledig aanpassen van de serialisatie-engine of meer algemene serialisatieopties als onderdeel van de clientconstructie.
Het aanpassen van de serialisatie op bewerkingsniveau kan worden bereikt door gebruik te maken van Stream-API's:
// .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
}
}
}
Vergelijkingen van codefragmenten
In het volgende codefragment ziet u de verschillen in de manier waarop resources worden gemaakt tussen de SDK's voor .NET v2 en v3:
Databasebewerkingen
Een -database maken
// 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));
Een database lezen op id
// 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()}");
}
}
}
Een database verwijderen
// 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");
}
}
}
Containerbewerkingen
Een container maken (automatisch schalen en time to live met verlooptijd)
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;
}
Containereigenschappen lezen
private static async Task ReadContainerProperties(Database database)
{
string containerIdManual = ContainerName + "_Manual";
Container container = database.GetContainer(containerIdManual);
ContainerProperties containerProperties = await container.ReadContainerAsync();
}
Een container verwijderen
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}");
}
}
}
}
Item- en querybewerkingen
Een item maken
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;
}
Alle items in een container lezen
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);
}
}
}
Query-items
Wijzigingen in SqlQuerySpec (QueryDefinition in v3.0 SDK)
De SqlQuerySpec
klasse in SDK v2 is nu gewijzigd QueryDefinition
in de SDK v3.
SqlParameterCollection
en SqlParameter
is verwijderd. Parameters worden nu toegevoegd aan het QueryDefinition
model met behulp van QueryDefinition.WithParameter
een opbouwfunctiemodel. Gebruikers hebben toegang tot de parameters met 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);
}
}
}
Een item verwijderen
private static async Task DeleteItemAsync(Container container)
{
ItemResponse<SalesOrder> response = await container.DeleteItemAsync<SalesOrder>(
partitionKey: new PartitionKey("Account1"), id: "SalesOrder3");
}
Wijzigingenfeedquery
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
}
}
}
Volgende stappen
- Een console-app bouwen om Azure Cosmos DB for NoSQL-gegevens te beheren met behulp van de v3 SDK
- Meer informatie over wat u kunt doen met de v3 SDK
- Wilt u capaciteitsplanning uitvoeren voor een migratie naar Azure Cosmos DB?
- Als alles wat u weet het aantal vcores en servers in uw bestaande databasecluster is, leest u meer over het schatten van aanvraageenheden met behulp van vCores of vCPU's
- Als u typische aanvraagtarieven voor uw huidige databaseworkload kent, leest u meer over het schatten van aanvraageenheden met behulp van azure Cosmos DB-capaciteitsplanner