My personal notes
T

Working on CosmosDB with .NET

You can use NuGet package Microsoft.Azure.Cosmos to work with CosmosDB.

Use and consume a CosmosClient

Creates a new CosmosClient with a connection string.

CosmosClient is thread-safe. It's recommended to maintain a single instance of CosmosClient per lifetime of the application that enables efficient connection management and performance.

CosmosClient client = new CosmosClient(endpoint, key);

Work with database

Create a db is not exists

Only the database id is used to verify if there's an existing database.

// An object containing relevant information about the response
DatabaseResponse databaseResponse = await client.CreateDatabaseIfNotExistsAsync(databaseId, throughputInRUsPerSecond);

Once you have the DatabaseResponse, you can cast it to a Database

Database database = databaseResponse;

Read a database by ID

You can use the reference to the DB to access the content.

DatabaseResponse readResponse = await database.ReadAsync();

Delete a database

await database.DeleteAsync();

Work with Container

Create a container if not exists

Here the partitionKey must begin with a / (an example is /LastName).

// Set throughput to the minimum value of 400 RU/s
ContainerResponse simpleContainer = await database.CreateContainerIfNotExistsAsync(
    id: containerId,
    partitionKeyPath: partitionKey,
    throughput: 400);

Get a container by id

Container container = database.GetContainer(containerId);
ContainerProperties containerProperties = await container.ReadContainerAsync();

Delete a container

await database.GetContainer(containerId).DeleteContainerAsync();

Work with items

Create an item

ItemResponse<SalesOrder> response = await container.CreateItemAsync(salesOrder, new PartitionKey(salesOrder.AccountNumber));

Read an item

The method requires type to serialize the item to along with an id property, and a partitionKey.

string id = "[id]";
string accountNumber = "[partition-key]";
ItemResponse<SalesOrder> response = await container
    .ReadItemAsync(id, new PartitionKey(accountNumber));

Query an item

The Container.GetItemQueryIterator method creates a query for items under a container in an Azure Cosmos database using a SQL statement with parameterized values. It returns a FeedIterator.

QueryDefinition query = new QueryDefinition(
    "select * from sales s where s.AccountNumber = @AccountInput ")
    .WithParameter("@AccountInput", "Account1");

FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
    query,
    requestOptions: new QueryRequestOptions()
    {
        PartitionKey = new PartitionKey("Account1"),
        MaxItemCount = 1
    });

[[Posso usare anche query LINQ]]

[[Anche con ITERATOR]]

Work with stored procedures

Before using a stored procedure, you have to register it. A stored procedure is strictly related to a collection.

Register a stored procedure

string storedProcedureId = "spCreateToDoItems";
StoredProcedureResponse storedProcedureResponse = await client
    .GetContainer("myDatabase", "myContainer")
    .Scripts
    .CreateStoredProcedureAsync(new StoredProcedureProperties
    {
        Id = storedProcedureId,
        Body = File.ReadAllText($@"..\js\{storedProcedureId}.js")
    });

Execute a stored procedure

dynamic[] newItems = new dynamic[]
{
    new {
        category = "Personal",
        name = "Groceries",
        description = "Pick up strawberries",
        isComplete = false
    },
    new {
        category = "Personal",
        name = "Doctor",
        description = "Make appointment for check up",
        isComplete = false
    }
};

var result = await client
.GetContainer("database", "container")
.Scripts.ExecuteStoredProcedureAsync<string>(
    "spCreateToDoItem",
    new PartitionKey("Personal"), new[] { newItems }
    );
Show Graph Visualisation