Google.Cloud.Datastore.V1

Google.Cloud.Datastore.V1 is a.NET client library for the Google Cloud Datastore API.

Note: This documentation is for version 4.7.0-beta01 of the library. Some samples may not work with other versions.

Installation

Install the Google.Cloud.Datastore.V1 package from NuGet. Add it to your project in the normal way (for example by right-clicking on the project in Visual Studio and choosing "Manage NuGet Packages..."). Please ensure you enable pre-release packages (for example, in the Visual Studio NuGet user interface, check the "Include prerelease" box). Some of the following samples might only work with the latest pre-release version (4.7.0-beta01) of Google.Cloud.Datastore.V1.

Authentication

When running on Google Cloud, no action needs to be taken to authenticate.

Otherwise, the simplest way of authenticating your API calls is to download a service account JSON file then set the GOOGLE_APPLICATION_CREDENTIALS environment variable to refer to it. The credentials will automatically be used to authenticate. See the Authentication use cases guide for more details.

Getting started

See the Datastore Quickstart for an introduction with runnable code samples.

The DatastoreDb class is provided as a wrapper for DatastoreClient, simplifying operations considerably by assuming all operations act on the same partition, and providing page streaming operations on structured query results.

Several custom conversions, additional constructors, factory methods (particularly on Filter are provided to simplify working with the protobuf messages.

Support for emulator detection

As of 2.2.0-beta02 and 2.2.0, the library has support for detecting the emulator via environment variables, if requested. This is configured via DatastoreDbBuilder, which can also be used to configure custom credentials easily.

The following code creates a DatastoreDb which will use the emulator when the environment variables are present, but will otherwise connect to the production environment.

DatastoreDb db = new DatastoreDbBuilder
{
    ProjectId = projectId,
    EmulatorDetection = EmulatorDetection.EmulatorOrProduction
}.Build();
// Use db as normal

See the EmulatorDetection enum for details of the other possible values.

Sample code

Inserting data

DatastoreDb db = DatastoreDb.Create(projectId, namespaceId);

KeyFactory keyFactory = db.CreateKeyFactory("message");
Entity entity = new Entity
{
    Key = keyFactory.CreateIncompleteKey(),
    ["created"] = DateTime.UtcNow,
    ["text"] = "Text of the message",
    ["tags"] = new[] { "tag1", "tag2" }
};
using (DatastoreTransaction transaction = db.BeginTransaction())
{
    transaction.Insert(entity);
    CommitResponse commitResponse = transaction.Commit();
    Key insertedKey = commitResponse.MutationResults[0].Key;
    Console.WriteLine($"Inserted key: {insertedKey}");
    // The key is also propagated to the entity
    Console.WriteLine($"Entity key: {entity.Key}");
}

Querying data

DatastoreDb db = DatastoreDb.Create(projectId, namespaceId);

// Print the messages created in the last 5 minutes, most recent first
DateTime cutoff = DateTime.UtcNow.AddMinutes(-5);
Query query = new Query("message")
{
    Filter = Filter.GreaterThanOrEqual("created", cutoff),
    Order = { { "created", Direction.Descending } }
};
foreach (Entity entity in db.RunQueryLazily(query))
{
    DateTime created = (DateTime)entity["created"];
    string text = (string)entity["text"];
    Console.WriteLine($"{created:yyyy-MM-dd'T'HH:mm:ss}: {text}");
}

When a query contains a projection, any timestamp fields will be returned using integer values. Use the Value.ToDateTimeFromProjection and Value.ToDateTimeOffsetFromProjection methods to convert either integer or timestamp values to DateTime or DateTimeOffset.

Lots more samples: github.com/googleapis/dotnet-docs-samples