

L'SDK AWS mobile per Xamarin è ora incluso in. AWS SDK per .NET Questa guida fa riferimento alla versione archiviata di Mobile SDK per Xamarin.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Amazon DynamoDB
<a name="dynamodb"></a>

## Che cos'è Amazon DynamoDB?
<a name="what-is-amazon-dynamodb"></a>

 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) è un servizio di database non relazionale veloce e altamente scalabile. DynamoDB rimuove le tradizionali limitazioni di scalabilità sullo storage dei dati mantenendo una bassa latenza e prestazioni prevedibili.

## Concetti chiave
<a name="key-concepts"></a>

I concetti del modello di dati DynamoDB includono tabelle, elementi e attributi.

### Tabelle
<a name="tables"></a>

In Amazon DynamoDB, un database è una raccolta di tabelle. Una tabella è una raccolta di elementi e ogni elemento è un insieme di attributi.

In un database relazionale, una tabella ha uno schema predefinito come il nome della tabella, la chiave primaria, l'elenco dei nomi delle colonne e i relativi tipi di dati. Tutti i record memorizzati nella tabella devono avere lo stesso set di colonne. Al contrario, DynamoDB richiede solo che una tabella abbia una chiave primaria, ma non richiede di definire in anticipo tutti i nomi degli attributi e i tipi di dati.

Per ulteriori informazioni sull'utilizzo delle tabelle, consulta [Lavorare con le tabelle in DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html).

### Elementi e attributi
<a name="items-and-attributes"></a>

I singoli elementi in una tabella DynamoDB possono avere un numero qualsiasi di attributi, sebbene esista un limite di 400 KB per la dimensione dell'elemento. La dimensione di un elemento è la somma delle lunghezze dei nomi e dei valori degli attributi (lunghezze binarie e UTF-8).

Ogni attributo di un elemento è una coppia nome-valore. Un attributo può essere un insieme a valore singolo o multivalore. Ad esempio, un elemento del libro può avere gli attributi del titolo e dell'autore. Ogni libro ha un titolo ma può avere molti autori. L'attributo multivalore è un set; non sono consentiti valori duplicati.

Ad esempio, prendete in considerazione l'archiviazione di un catalogo di prodotti in DynamoDB. È possibile creare una tabella con ProductCatalog l'attributo Id come chiave primaria. La chiave primaria identifica in modo univoco ogni articolo, in modo che due prodotti nella tabella non possano avere lo stesso ID.

Per ulteriori informazioni sull'utilizzo degli elementi, consulta [Lavorare con gli elementi in DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html).

### Tipi di dati
<a name="data-types"></a>

Amazon DynamoDB supporta i seguenti tipi di dati:
+  **Tipi scalari**: Number, String, Binary, Boolean e Null.
+  **Tipi multivalore**: set di stringhe, set di numeri e set binario.
+  **Tipi di documenti**: elenco e mappa.

[Per ulteriori informazioni sui tipi di dati scalari, i tipi di dati multivalore e i tipi di dati del documento, vedere Tipi di dati DynamoDB.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes)

### Chiave primaria
<a name="primary-key"></a>

Quando crei una tabella, oltre al nome della tabella, è necessario specificare la chiave primaria della tabella. La chiave primaria identifica in modo univoco ogni elemento della tabella, in modo che due elementi non possano avere la stessa chiave. DynamoDB supporta i seguenti due tipi di chiavi primarie:
+  Chiave **hash: La chiave** primaria è composta da un attributo, un attributo hash. DynamoDB crea un indice hash non ordinato su questo attributo chiave primario. Ogni elemento della tabella è identificato in modo univoco dal relativo valore di chiave hash.
+  **Hash e Range Key**: la chiave primaria è composta da due attributi. Il primo attributo è l'attributo hash e il secondo è l'attributo range. DynamoDB crea un indice hash non ordinato sull'attributo della chiave primaria hash e un indice di intervallo ordinato sull'attributo della chiave primaria range. Ogni elemento della tabella è identificato in modo univoco dalla combinazione dei valori delle chiavi hash e range. È possibile che due elementi abbiano lo stesso valore di chiave hash, ma tali due elementi devono avere valori di chiave di intervallo diversi.

### Indici secondari
<a name="secondary-indexes"></a>

Quando crei una tabella con un hash e una chiave di intervallo, puoi facoltativamente definire uno o più indici secondari su quella tabella. Un indice secondario consente di eseguire query sui dati nella tabella utilizzando una chiave alternativa, oltre alle query sulla chiave primaria.

DynamoDB supporta due tipi di indici secondari: indici secondari locali e indici secondari globali.
+  **Indice secondario locale: un indice** che ha la stessa chiave hash della tabella, ma una chiave di intervallo diversa.
+  **Indice secondario globale**: un indice con un hash e una chiave di intervallo che può essere diverso da quelli della tabella.

È possibile definire fino a 5 indici secondari globali e 5 indici secondari locali per tabella. Per ulteriori informazioni, consulta Improving [Data Access with Secondary Indexes in DynamoDB nella DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html).

### Interrogazione e scansione
<a name="query-and-scan"></a>

Oltre a utilizzare le chiavi primarie per accedere agli elementi, Amazon DynamoDB ne fornisce anche APIs due per la ricerca dei dati: Query e Scan. Ti consigliamo di leggere [le Guidelines for Query and Scan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html) nella DynamoDB Developer Guide per acquisire familiarità con alcune best practice.

#### Query
<a name="query"></a>

Un'operazione di Query trova gli elementi in una tabella o in un indice secondario utilizzando solo i valori degli attributi chiave primari. È necessario fornire un nome di attributo chiave hash e un valore distinto da cercare. Facoltativamente, è possibile fornire un nome e un valore dell'attributo chiave di intervallo e utilizzare un operatore di confronto per affinare i risultati della ricerca.

Per domande di esempio, consulta:
+  [Utilizzo del modello di documento](dynamodb-integration-docmodel.md) 
+  [Utilizzo del modello di persistenza degli oggetti](dynamodb-integration-objectpersistencemodel.md) 
+  [Utilizzo del livello di servizio DynamoDB APIs](dynamodb-integration-lowlevelapi.md) 

Per ulteriori informazioni su Query, consulta [Query](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query) nella DynamoDB Developer Guide.

#### Scan
<a name="scan"></a>

Un'operazione di scansione legge ogni elemento di una tabella o di un indice secondario. Per impostazione predefinita, un'operazione di scansione restituisce tutti gli attributi dei dati per ogni elemento della tabella o dell'indice. È possibile utilizzare il ProjectionExpression parametro in modo che Scan restituisca solo alcuni attributi, anziché tutti.

Per esempi di scansioni, vedi:
+  [Utilizzo del modello di documento](dynamodb-integration-docmodel.md) 
+  [Utilizzo del modello di persistenza degli oggetti](dynamodb-integration-objectpersistencemodel.md) 
+  [Utilizzo del livello di servizio DynamoDB APIs](dynamodb-integration-lowlevelapi.md) 

Per ulteriori informazioni su Scan, consulta [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Scan) nella DynamoDB Developer Guide.

## Configurazione del progetto
<a name="project-setup"></a>

### Prerequisiti
<a name="prerequisites"></a>

Per utilizzare DynamoDB nella tua applicazione, devi aggiungere l'SDK al tuo progetto. A tale scopo, segui le istruzioni in [Configurazione dell'SDK AWS Mobile per.NET and Xamarin](setup.md).

### Creare una tabella DynamoDB
<a name="create-a-dynamodb-table"></a>

Per creare una tabella, accedi alla console [DynamoDB e segui questi](https://console.aws.amazon.com/dynamodb/home) passaggi:

1. Fare clic su **Create Table (Crea tabella)**.

1. Inserisci il nome della tabella.

1. Seleziona **Hash** come tipo di chiave principale.

1. Seleziona un tipo e inserisci un valore per il nome dell'attributo hash. Fai clic su **Continue** (Continua).

1. Nella pagina **Aggiungi indici**, se prevedi di utilizzare indici secondari globali, imposta il **tipo di indice** su «Indice secondario globale» e in Index **Hash Key, inserisci un valore per l'indice** secondario. Ciò ti consentirà di eseguire query e scansioni utilizzando sia l'indice primario che l'indice secondario. Fai clic su **Aggiungi indice alla tabella**, quindi su **Continua**. **Per non utilizzare gli indici secondari globali, fai clic su Continua.**

1. Imposta la capacità di lettura e scrittura ai livelli desiderati. Per ulteriori informazioni sulla configurazione della capacità, consulta [Provisioned Throughput in Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html). Fai clic su **Continue** (Continua).

1. Nella schermata successiva, inserisci un'e-mail di notifica per creare allarmi di throughput, se lo desideri. Fai clic su **Continue** (Continua).

1. **Nella pagina di riepilogo, fai clic su Crea.** DynamoDB creerà il tuo database.

### Impostazione delle autorizzazioni per DynamoDB
<a name="set-permissions-for-dynamodb"></a>

Per utilizzare DynamoDB in un'applicazione, è necessario impostare le autorizzazioni corrette. [La seguente policy IAM consente all'utente di eliminare, ottenere, inserire, interrogare, scansionare e aggiornare gli elementi in una tabella DynamoDB specifica, identificata da ARN:](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
    }
  ]
}
```

[È possibile modificare le policy nella console IAM.](https://console.aws.amazon.com/iam/) Dovresti aggiungere o rimuovere le azioni consentite in base alle esigenze della tua app.

Per ulteriori informazioni sulle policy IAM, consulta la sezione relativa all'[utilizzo di IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html).

Per ulteriori informazioni sulle policy specifiche di DynamoDB, consulta [Using IAM to Control Access to DynamoDB Resources nella DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html).

## Integrazione di DynamoDB con la tua applicazione
<a name="integrating-dynamodb-with-your-application"></a>

L'SDK AWS Mobile per .NET e Xamarin fornisce una libreria di alto livello per lavorare con DynamoDB. Puoi anche effettuare richieste direttamente all'API DynamoDB di basso livello, ma per la maggior parte dei casi d'uso è consigliata la libreria di alto livello. AmazonDynamoDBClient È una parte particolarmente utile della libreria di alto livello. Utilizzando questa classe, è possibile eseguire varie operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) ed eseguire interrogazioni.

L'SDK AWS Mobile per .NET e Xamarin ti consente di APIs effettuare chiamate utilizzando l'SDK AWS for .NET per lavorare con DynamoDB. Tutti sono disponibili nel file dll. APIs AWSSDK Per informazioni sul download dell'SDK AWS per.NET, [consulta SDK AWS](https://aws.amazon.com/sdk-for-net/) per .NET.

Esistono tre modi per interagire con DynamoDB nell'applicazione Xamarin:
+  **Modello di documento**: questa API fornisce classi wrapper attorno all'API DyanModB di basso livello per semplificare ulteriormente le attività di programmazione. Table e Document sono le classi wrapper chiave. È possibile utilizzare il modello di documento per le operazioni sui dati come creare, recuperare, aggiornare ed eliminare elementi. L'API è disponibile in Amazon.DynamoDB. DocumentModel namespace.
+  **Modello di persistenza degli oggetti**: l'API Object Persistence consente di mappare le classi lato client alle tabelle DynamoDB. Ogni istanza dell'oggetto viene quindi mappata a un elemento nelle tabelle corrispondenti. La DBContext classe Dynamo di questa API fornisce metodi per salvare oggetti lato client in una tabella, recuperare elementi come oggetti ed eseguire query e scansioni. È possibile utilizzare il modello Object Persistence per le operazioni sui dati come la creazione, il recupero, l'aggiornamento e l'eliminazione di elementi. È necessario innanzitutto creare le tabelle utilizzando l'API Service Client e quindi utilizzare il modello di persistenza degli oggetti per mappare le classi alle tabelle. L'API è disponibile in Amazon.DynamoDB. DataModel namespace.
+  **API Service Client**: questa è l'API a livello di protocollo che si collega strettamente all'API DynamoDB. È possibile utilizzare questa API di basso livello per tutte le operazioni relative a tabelle ed elementi, come la creazione, l'aggiornamento e l'eliminazione di tabelle ed elementi. Puoi anche interrogare e scansionare le tue tabelle. Questa API è disponibile nello spazio dei nomi Amazon.DynamoDB.

Questi tre modelli vengono approfonditi nei seguenti argomenti:

**Topics**

# Utilizzo del modello di documento
<a name="dynamodb-integration-docmodel"></a>

Il Document Model fornisce classi wrapper basate sull'API.NET di basso livello. Table e Document sono le classi wrapper chiave. È possibile utilizzare il modello di documento per creare, recuperare, aggiornare ed eliminare elementi. Per creare, aggiornare ed eliminare tabelle, è necessario utilizzare l'API di basso livello. Per istruzioni su come utilizzare l'API di basso livello, consulta [Utilizzo del livello di servizio DynamoDB](dynamodb-integration-lowlevelapi.md). APIs L'API di basso livello è disponibile in Amazon.DynamoDB. DocumentModel namespace.

Per ulteriori informazioni sul Document Model, [vedi.NET Document](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKMidLevel.html) Model.

## Creare un client DynamoDB
<a name="create-a-dynamodb-client"></a>

Per creare un client DynamoDB:

```
var client = new AmazonDynamoDBClient(credentials,region);
DynamoDBContext context = new DynamoDBContext(client);
```

## Operazioni CRUD
<a name="crud-operations"></a>

### Salvataggio di una voce
<a name="save-an-item"></a>

Crea un elemento:

```
Table table = Table.LoadTable(client, "Books");
id = Guid.NewGuid().ToString();
var books = new Document();
books["Id"] = id;
books["Author"] = "Mark Twain";
books["Title"] = "Adventures of Huckleberry Finn";
books["ISBN"] = "112-111111";
books["Price"] = "10";
```

Salva un elemento in una tabella DynamoDB:

```
var book = await table.PutItemAsync(books);
```

### Recupero di una voce
<a name="retrieve-an-item"></a>

Per recuperare un elemento:

```
public async Task GetItemAsync(AWSCredentials credentials, RegionEndpoint region)
{
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      var book = await books.GetItemAsync(id);
}
```

### Aggiornamento di una voce
<a name="update-an-item"></a>

Per aggiornare un articolo:

```
public async Task UpdateItemAttributesAsync(AWSCredentials credentials, RegionEndpoint region)
{
      var book = new Document();
      book["Id"] = id;
      book["PageCount"] = "200";
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      Document updatedBook = await books.UpdateItemAsync(book);
}
```

Per aggiornare un articolo in modo condizionale:

```
public async Task UpdateItemConditionallyAsync(AWSCredentials credentials, RegionEndpoint region) {
      var book = new Document();
      book["Id"] = id;
      book["Price"] = "30";

      // For conditional price update, creating a condition expression.
      Expression expr = new Expression();
      expr.ExpressionStatement = "Price = :val";
      expr.ExpressionAttributeValues[":val"] = 10.00;

      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");

      Document updatedBook = await books.UpdateItemAsync(book);
}
```

### Eliminazione di una voce
<a name="delete-an-item"></a>

Per eliminare un elemento:

```
public async Task DeleteItemAsync(AWSCredentials credentials, RegionEndpoint region)
{
  var client = new AmazonDynamoDBClient(credentials, region);
  Table books = Table.LoadTable(client, "Books");
  await books.DeleteItemAsync(id);
}
```

### Interrogazione e scansione
<a name="query-and-scan"></a>

Per interrogare e recuperare tutti i libri il cui autore è «Mark Twain»:

```
public async Task QueryAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  Table books = Table.LoadTable(client, "Books");
  var search = books.Query(new QueryOperationConfig() {
   IndexName = "Author-Title-index",
   Filter = new QueryFilter("Author", QueryOperator.Equal, "Mark Twain")
  });
  Console.WriteLine("ScanAsync: printing query response");
  var documents = await search.GetRemainingAsync();
  documents.ForEach((d) = > {
   PrintDocument(d);
  });
}
```

Il codice di esempio di scansione riportato di seguito restituisce tutti i libri della nostra tabella:

```
public async Task ScanAsync(AWSCredentials credentials, RegionEndpoint region) {
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      var search = books.Scan(new ScanOperationConfig() {
              ConsistentRead = true
      });
      Console.WriteLine("ScanAsync: printing scan response");
      var documents = await search.GetRemainingAsync();
      documents.ForEach((d) = > {
              PrintDocument(d);
      });
}
```

# Utilizzo del modello di persistenza degli oggetti
<a name="dynamodb-integration-objectpersistencemodel"></a>

L'SDK AWS Mobile per .NET and Xamarin fornisce un modello di Object Persistence che consente di mappare le classi lato client su una tabella DynamoDB. Ogni istanza di oggetto viene quindi mappata su un elemento nella tabella corrispondente. Per salvare gli oggetti sul lato client in una tabella, il modello Object Persistence fornisce la DBContext classe Dynamo, un punto di ingresso a DynamoDB. Questa classe fornisce una connessione a DynamoDB e consente di accedere alle tabelle, eseguire varie operazioni CRUD ed eseguire query.

Il modello Object Persistence non fornisce un'API per creare, aggiornare o eliminare tabelle. Esso fornisce solo operazioni di dati. Per creare, aggiornare ed eliminare tabelle, è necessario utilizzare l'API di basso livello. Per istruzioni su come utilizzare l'API di basso livello, consulta [Utilizzo del livello di servizio DynamoDB](dynamodb-integration-lowlevelapi.md). APIs

## Panoramica di
<a name="overview"></a>

Il modello Object Persistence fornisce un set di attributi per mappare le classi lato client alle tabelle e agli attributi delle tabelle. properties/fields Il modello Object Persistence supporta sia la mappatura esplicita che quella predefinita tra le proprietà delle classi e gli attributi delle tabelle.
+  **Mappatura esplicita: per mappare** una proprietà a una chiave primaria, è necessario utilizzare gli attributi del modello Dynamo Key e Dynamo DBHash Key Object Persistence. DBRange Inoltre, per gli attributi della chiave non primaria, se il nome di una proprietà nella classe e l'attributo di tabella corrispondente a cui si desidera mapparla non sono gli stessi, è necessario definire la mappatura aggiungendo esplicitamente l'attributo Dynamo. DBProperty
+  **Mappatura predefinita**: per impostazione predefinita, il modello Object Persistence mappa le proprietà della classe agli attributi con lo stesso nome nella tabella.

Non è necessario mappare ogni singola proprietà della classe. È possibile identificare queste proprietà aggiungendo l'attributo DynamoDBIgnore . Il salvataggio e il recupero di un'istanza di un oggetto comporterebbero l'omissione di qualsiasi proprietà contrassegnata con questo attributo.

## Tipi di dati supportati
<a name="supported-data-types"></a>

Il modello Object Persistence supporta un insieme di tipi di dati.NET primitivi, raccolte e tipi di dati arbitrari. Il modello supporta i seguenti tipi di dati primitivi:
+ bool
+ byte
+ char
+ DateTime
+ decimale, doppio, float
+ Int16, Int32, Int64
+ SByte
+ stringa
+ UInt16, UInt32, UInt64

Il modello Object Persistence supporta anche i tipi di raccolte.NET con le seguenti limitazioni:
+ Il tipo di raccolta deve implementare l' ICollection interfaccia.
+ Il tipo di raccolta deve essere composto dai tipi primitivi supportati. <bool>Ad esempio ICollection<string>, ICollection.
+ Il tipo di raccolta deve fornire un costruttore senza parametri.

Per ulteriori informazioni sul modello Object Persistence, [vedi.NET](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html) Object Persistence Model.

## Creare un client DynamoDB
<a name="create-a-dynamodb-client"></a>

Per creare un client DynamoDB:

```
var client = new AmazonDynamoDBClient(credentials,region);
DynamoDBContext context = new DynamoDBContext(client);
```

## Operazioni CRUD
<a name="crud-operations"></a>

### Salvare un oggetto
<a name="save-an-object"></a>

Crea un oggetto:

```
[DynamoDBTable("Books")]
public class Book {
  [DynamoDBHashKey] // Hash key.
  public string Id {
    get;
    set;
  }

  [DynamoDBGlobalSecondaryIndexHashKey]
  public string Author {
    get;
    set;
  }

  [DynamoDBGlobalSecondaryIndexRangeKey]
  public string Title {
    get;
    set;
  }
  public string ISBN {
    get;
    set;
  }
  public int Price {
    get;
    set;
  }
  public string PageCount {
    get;
    set;
  }
}

Book myBook = new Book
{
    Id = id,
    Author = "Charles Dickens",
    Title = "Oliver Twist",
    ISBN = "111-1111111001",
    Price = 10,
    PageCount = 300
};
```

Salva un oggetto in una tabella DynamoDB:

```
context.Save(myBook);
```

### Recupera un oggetto
<a name="retrieve-an-object"></a>

Per recuperare un oggetto:

```
Book retrievedBook = context.Load<Book>(1);
```

### Aggiornare un oggetto
<a name="update-an-object"></a>

Per aggiornare un oggetto:

```
Book retrievedBook = context.Load<Book>(1);
retrievedBook.ISBN = "111-1111111001";
context.Save(retrievedBook);
```

### Eliminazione di un oggetto
<a name="delete-an-object"></a>

Per eliminare un oggetto:

```
Book retrievedBook = context.Load<Book>(1);
context.Delete(retrievedBook);
```

## Interrogazione e scansione
<a name="query-and-scan"></a>

Per interrogare e recuperare tutti i libri il cui autore è «Charles Dickens»:

```
public async Task QueryAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  DynamoDBContext context = new DynamoDBContext(client);

  var search = context.FromQueryAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.QueryOperationConfig() {
    IndexName = "Author-Title-index",
    Filter = new Amazon.DynamoDBv2.DocumentModel.QueryFilter("Author", Amazon.DynamoDBv2.DocumentModel.QueryOperator.Equal, "Charles Dickens")
  });

  Console.WriteLine("items retrieved");

  var searchResponse = await search.GetRemainingAsync();
  searchResponse.ForEach((s) = > {
    Console.WriteLine(s.ToString());
  });
}
```

Il codice di esempio di scansione riportato di seguito restituisce tutti i libri della nostra tabella:

```
public async Task ScanAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  DynamoDBContext context = new DynamoDBContext(client);

  var search = context.FromScanAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.ScanOperationConfig() {
   ConsistentRead = true
  });

  Console.WriteLine("items retrieved");

  var searchResponse = await search.GetRemainingAsync();
  searchResponse.ForEach((s) = > {
   Console.WriteLine(s.ToString());
  });
}
```

# Utilizzo del livello di servizio DynamoDB APIs
<a name="dynamodb-integration-lowlevelapi"></a>

Il livello di servizio Dynamo APIs consente di creare, aggiornare ed eliminare tabelle. È inoltre possibile eseguire operazioni tipiche di creazione, lettura, aggiornamento ed eliminazione (CRUD) sugli elementi di una tabella utilizzando questa API.

## Creare un client DynamoDB
<a name="create-a-dynamodb-client"></a>

Per creare un client DynamoDB:

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);
```

## Operazioni CRUD
<a name="crud-operations"></a>

### Salvataggio di una voce
<a name="save-an-item"></a>

Per salvare un elemento in una tabella DynamoDB:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

// Define item attributes
Dictionary<string, AttributeValue> attributes = new Dictionary<string, AttributeValue>();

// Author is hash-key
attributes["Author"] = new AttributeValue { S = "Mark Twain" };
attributes["Title"] = new AttributeValue { S = "The Adventures of Tom Sawyer" };
attributes["PageCount"] = new AttributeValue { N = "275" };
attributes["Price"] = new AttributeValue{N = "10.00"};
attributes["Id"] = new AttributeValue{N="10"};
attributes["ISBN"] = new AttributeValue{S="111-1111111"};

// Create PutItem request
PutItemRequest request = new PutItemRequest
{
    TableName = "Books",
    Item = attributes
};

// Issue PutItem request
var response = await client.PutItemAsync(request);
```

### Recupero di una voce
<a name="retrieve-an-item"></a>

Per recuperare un elemento:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
    { "Id", new AttributeValue { N = "10" } }
};

// Create GetItem request
GetItemRequest request = new GetItemRequest
{
    TableName = "Books",
    Key = key,
};

// Issue request
var result = await client.GetItemAsync(request);

// View response
Console.WriteLine("Item:");
Dictionary<string, AttributeValue> item = result.Item;
foreach (var keyValuePair in item)
{
    Console.WriteLine("Author := {0}", item["Author"]);
    Console.WriteLine("Title := {0}", item["Title"]);
    Console.WriteLine("Price:= {0}", item["Price"]);
    Console.WriteLine("PageCount := {0}", item["PageCount"]);
}
```

### Aggiornamento di una voce
<a name="update-an-item"></a>

Per aggiornare un elemento:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
    { "Id", new AttributeValue { N = "10" } }
};

// Define attribute updates
Dictionary<string, AttributeValueUpdate> updates = new Dictionary<string, AttributeValueUpdate>();
// Add a new string to the item's Genres SS attribute
updates["Genres"] = new AttributeValueUpdate()
{
    Action = AttributeAction.ADD,
    Value = new AttributeValue { SS = new List<string> { "Bildungsroman" } }
};

// Create UpdateItem request
UpdateItemRequest request = new UpdateItemRequest
{
    TableName = "Books",
    Key = key,
    AttributeUpdates = updates
};

// Issue request
var response = await client.UpdateItemAsync(request);
```

### Eliminazione di una voce
<a name="delete-an-item"></a>

Per eliminare un elemento:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
  { "Id", new AttributeValue { N = "10" } }
};

// Create DeleteItem request
DeleteItemRequest request = new DeleteItemRequest
{
  TableName = "Books",
  Key = key
};

// Issue request
var response = await client.DeleteItemAsync(request);
```

## Interrogazione e scansione
<a name="query-and-scan"></a>

Per interrogare e recuperare tutti i libri il cui autore è «Mark Twain»:

```
public void Query(AWSCredentials credentials, RegionEndpoint region) {
  using(var client = new AmazonDynamoDBClient(credentials, region)) {
    var queryResponse = await client.QueryAsync(new QueryRequest() {
      TableName = "Books",
      IndexName = "Author-Title-index",
      KeyConditionExpression = "Author = :v_Id",
      ExpressionAttributeValues = new Dictionary < string, AttributeValue > {
        {
          ":v_Id", new AttributeValue {
            S = "Mark Twain"
          }
        }
      }
    });
    queryResponse.Items.ForEach((i) = > {
      Console.WriteLine(i["Title"].S);
    });

  }
}
```

Il codice di esempio di scansione riportato di seguito restituisce tutti i libri della nostra tabella:

```
public void Scan(AWSCredentials credentials, RegionEndpoint region) {
      using(var client = new AmazonDynamoDBClient(credentials, region)) {
              var queryResponse = client.Scan(new ScanRequest() {
                      TableName = "Books"
              });
              queryResponse.Items.ForEach((i) = > {
                      Console.WriteLine(i["Title"].S);
              });
      }
}
```