

 AWS Mobile SDK for Xamarin が に含まれるようになりました AWS SDK for .NET。このガイドでは、Mobile SDK for Xamarin のアーカイブバージョンについて説明します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

## Amazon DynamoDB とは
<a name="what-is-amazon-dynamodb"></a>

 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) は、拡張性に優れた、高速な非リレーショナルデータベースサービスです。DynamoDB により、データストレージに対して低いレイテンシーと予測可能なパフォーマンスを維持しながら、従来の拡張性の限界を排除できます。

## 主なコンセプト
<a name="key-concepts"></a>

DynamoDB データモデルのコンセプトには、テーブル、項目、属性が含まれます。

### テーブル
<a name="tables"></a>

Amazon DynamoDB では、データベースはテーブルの集合体です。テーブルは項目の集合であり、各項目は属性の集合です。

リレーショナルデータベースのテーブルには、テーブル名、プライマリキー、列名とデータ型のリストなど、事前定義されたスキーマがあります。テーブルに保存されているすべてのレコードは、同じ一連の列で構成されている必要があります。それに対し、DynamoDB では、テーブルに 1 つのプライマリキーが設定されていることのみが必要であり、すべての属性名とデータ型を事前に定義する必要はありません。

テーブルの操作方法の詳細については、「[DynamoDB のテーブルの操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html)」を参照してください。

### 項目と属性
<a name="items-and-attributes"></a>

DynamoDB テーブル内の個々の項目には多数の属性があります。ただし、項目サイズに対する 400KB の制限があります。項目のサイズは、属性名と値の長さの合計です（バイナリおよび UTF-8 の長さ）。

項目の各属性は、名前と値のペアです。属性には単一値または多値のセットを指定できます。たとえば書籍項目には、題名と著者の属性を指定できます。それぞれの書籍の題名は 1 つですが、多数の著者を指定できます。多値属性は 1 つのセットであり、値の重複は許可されていません。

たとえば、製品カタログを DynamoDB に保存するとします。ID 属性をプライマリキーとして ProductCatalog テーブルを作成します。プライマリキーは各項目を一意に識別するため、テーブル内の 2 つの製品が同じ ID を持つことはできません。

項目の操作に関する詳細については、「[DynamoDB の項目の操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html)」を参照してください。

### データ型
<a name="data-types"></a>

Amazon DynamoDB では、次のデータ型をサポートしています。
+  **スカラー型** – 数値、文字列、バイナリ、ブール、Null。
+  **多値型** – 文字列セット、数値セット、バイナリセット。
+  **ドキュメント型** – リスト、マップ。

データ型 (スカラー型、多値型、ドキュメント型) の詳細については、「[DynamoDB データ型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes)」を参照してください。

### プライマリキー
<a name="primary-key"></a>

テーブルを作成する場合には、テーブル名に加えて、テーブルのプライマリキーを指定する必要があります。プライマリキーはテーブル内の各項目を一意に識別するため、2 つの項目が同じキーを持つことはできません。DynamoDB では、次の 2 つのタイプのプライマリキーがサポートされています。
+  **ハッシュキー**: プライマリキーは、ハッシュ属性という 1 つの属性で構成されています。DynamoDB では、このプライマリキー属性について、順序を指定しないハッシュインデックスを構築します。テーブルの各項目は、ハッシュキー値によって一意に識別されます。
+  **ハッシュキーおよびレンジキー**: プライマリキーは、2 つの属性で構成されています。最初の属性はハッシュ属性で、2 番目の属性が範囲属性です。DynamoDB では、ハッシュプライマリキー属性に基づいて、順序を指定しないハッシュインデックスを構築し、レンジプライマリキー属性に基づいて、ソートされたレンジインデックスを構築します。テーブルの各項目は、ハッシュキーと範囲キーの値の組み合わせによって識別されます。2 つの項目でハッシュキー値を同じにすることは可能ですが、これらの 2 つの項目の範囲キー値は異なっている必要があります。

### セカンダリインデックス
<a name="secondary-indexes"></a>

ハッシュキーおよびレンジキーを使用してテーブルを作成するときに、必要に応じてそのテーブルで 1 つ以上のセカンダリインデックスを定義できます。セカンダリインデックスでは、プライマリキーに対するクエリに加えて、代替キーを使用して、テーブル内のデータのクエリを行うことができます。

DynamoDB では、2 種類のセカンダリインデックス (ローカルセカンダリインデックスおよびグローバルセカンダリインデックス) をサポートしています。
+  **ローカルセカンダリインデックス**: テーブルと同じハッシュキーと、異なるレンジキーを持つインデックス。
+  **グローバルセカンダリインデックス**: テーブルと異なるハッシュキーとレンジキーを持つインデックス。

テーブルあたり最大 5 個のグローバルセカンダリインデックスと 5 個のローカルセカンダリインデックスを定義できます。詳細については、DynamoDB 開発者ガイドの「[DynamoDB でのセカンダリインデックスを使用したデータアクセス性の向上](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html)」を参照してください。

### クエリおよびスキャン
<a name="query-and-scan"></a>

Amazon DynamoDB では、プライマリキーを使用した項目へのアクセスに加えて、データの検索用に Query と Scan という 2 つの API も用意されています。いくつかのベストプラクティスを理解するために、DynamoDB 開発者ガイドの「[クエリおよびスキャンのガイドライン](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html)」をお読みになることをお勧めします。

#### クエリ
<a name="query"></a>

Query オペレーションでは、プライマリキーの属性値を使用してテーブルまたはセカンダリインデックスの項目を検索します。ハッシュキーの属性名と検索対象の個別の値を指定する必要があります。必要に応じて、レンジキーの属性名と値を指定し、比較演算子を使用して、検索結果をさらに絞り込むことができます。

サンプルクエリについては、以下を参照してください。
+  [ドキュメントモデルを使用する](dynamodb-integration-docmodel.md) 
+  [オブジェクト永続性モデルの使用](dynamodb-integration-objectpersistencemodel.md) 
+  [DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md) 

Query の詳細については、DynamoDB 開発者ガイドの「[Query](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query)」を参照してください。

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

Scan オペレーションでは、テーブルまたはセカンダリインデックスのすべての項目を読み込みます。デフォルトでは、Scan オペレーションはテーブルまたはインデックスのすべての項目のデータ属性を返します。ProjectionExpression パラメータを使用し、Scan がすべての属性ではなく一部のみを返すようにできます。

サンプルの Scan については、以下を参照してください。
+  [ドキュメントモデルを使用する](dynamodb-integration-docmodel.md) 
+  [オブジェクト永続性モデルの使用](dynamodb-integration-objectpersistencemodel.md) 
+  [DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md) 

Scan の詳細については、DynamoDB 開発者ガイドの「[Scan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Scan)」を参照してください。

## プロジェクトのセットアップ
<a name="project-setup"></a>

### 前提条件
<a name="prerequisites"></a>

アプリケーションで DynamoDB を使用するには、プロジェクトに SDK を追加する必要があります。「[AWS Mobile SDK for .NET and Xamarin をセットアップする](setup.md)」の手順に従って、追加します。

### DynamoDB テーブルの作成
<a name="create-a-dynamodb-table"></a>

テーブルを作成するには、[DynamoDB コンソール](https://console.aws.amazon.com/dynamodb/home)に移動し、次の手順に従って操作します。

1. [**テーブルの作成**] をクリックします。

1. テーブルの名前を入力します。

1. プライマリキーのタイプとして、[**ハッシュ**] を選択します。

1. タイプを選択し、ハッシュ属性名の値を入力します。[**次へ**] をクリックします。

1. [**Add Indexes (インデックスの追加)**] ページで、グローバルセカンダリインデックスを使用する予定の場合は、[**Index Type (インデックスタイプ)**] に「グローバルセカンダリインデックス」を設定し、[**Index Hash Key (インデックスハッシュキー)**] で、セカンダリインデックスの値を入力します。これにより、プライマリインデックスとセカンダリインデックスの両方を使用して、クエリとスキャンを行うことができます。[**Add Index To Table (テーブルにインデックスを追加)**] をクリックし、続いて [**続行**] をクリックします。グローバルセカンダリインデックスを使用してスキップするには、[**続行**] をクリックします。

1. 読み込みおよび書き込みキャパシティーを目的のレベルに設定します。キャパシティー設定の詳細については、「[Provisioned Throughput in Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html)」を参照してください。[**次へ**] をクリックします。

1. 次の画面で、通知 E メールを入力し、必要に応じてスループットアラームを作成します。[**次へ**] をクリックします。

1. [概要] ページで、[**作成**] をクリックします。DynamoDB にデータベースが作成されます。

### DynamoDB のアクセス許可を設定する
<a name="set-permissions-for-dynamodb"></a>

DynamoDB をアプリケーションで使用するには、適切なアクセス許可を設定する必要があります。次の IAM ポリシーでは、ユーザーは特定の DynamoDB テーブルの項目を削除、取得、挿入、クエリ、スキャン、更新することができます。このポリシーは、[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"
    }
  ]
}
```

ポリシーは、[IAM コンソール](https://console.aws.amazon.com/iam/)で変更できます。アプリケーションのニーズに応じて、許可されているアクションを追加または削除する必要があります。

IAM ポリシーの詳細については、「[IAM の使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html)」を参照してください。

DynamoDB 固有のポリシーの詳細については、DynamoDB 開発者ガイドの「[IAM を使用して DynamoDB リソースへのアクセスをコントロールする](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)」を参照してください。

## DynamoDB とアプリケーションの統合
<a name="integrating-dynamodb-with-your-application"></a>

AWS Mobile SDK for .NET and Xamarin には、DynamoDB を操作するための高レベルのライブラリが用意されています。低レベルの DynamoDB API に対してリクエストすることもできますが、ほとんどのユースケースにおいて、ハイレベルのライブラリが推奨されています。特に、AmazonDynamoDBClient は高レベルライブラリの便利な部分です。このクラスを使用することで、さまざまな (CRUD) 操作の作成、読み取り、更新、削除、およびクエリの実行を行うことができます。

AWS Mobile SDK for .NET and Xamarin では、DynamoDB を操作するために、AWS SDK for .NET から API を使用して呼び出すことができます。API はすべて、AWSSDK.dll で利用できます。AWS SDK for .NET のダウンロードの詳細については、「[AWS SDK for .NET](https://aws.amazon.com/sdk-for-net/)」を参照してください。

Xamarin アプリケーションで DynamoDB を操作する方法は、3 種類あります。
+  **ドキュメントモデル**: この API には、お客様のプログラミングタスクを簡素化する低レベル DyanmoDB API のラッパークラスが用意されています。テーブルとドキュメントが主要なラッパークラスです。ドキュメントモデルは、項目の作成、取得、更新、削除などのデータオペレーションに使用できます。この API は、Amazon.DynamoDB.DocumentModel 名前空間で利用できます。
+  **オブジェクト永続性モデル**: オブジェクト永続性 API では、クライアント側のクラスを DynamoDB テーブルにマッピングすることができます。各オブジェクトインスタンスが、対応するテーブルの項目にマッピングされます。この API 内にある DynamoDBContext クラスによって、クライアント側オブジェクトをテーブルに保存し、項目をオブジェクトとして取得し、クエリおよびスキャンを実行するメソッドが提供されます。オブジェクト永続性モデルは、項目の作成、取得、更新、削除などのデータオペレーションに使用できます。まず、サービスクライアント API を使用してテーブルを作成する必要があります。次に、オブジェクト永続性モデルを使用して、クラスをテーブルにマッピングします。この API は、Amazon.DynamoDB.DataModel 名前空間で利用できます。
+  **サービスクライアント API**: これは、プロトコルレベルの API であり、DynamoDB API に緊密にマッピングされます。この低レベル API は、テーブルおよび項目のすべてのオペレーション (テーブルおよび項目の作成、更新、削除など) に使用できます。テーブルに対するクエリおよびスキャンも可能です。この API は、Amazon.DynamoDB 名前空間で利用できます。

これらの 3 つのモデルは、次のトピックで詳しく説明します。

**Topics**

# ドキュメントモデルの使用
<a name="dynamodb-integration-docmodel"></a>

ドキュメントモデルは、低レベル .NET API の周囲にラッパークラスを提供しています。テーブルとドキュメントが主要なラッパークラスです。ドキュメントモデルを使用して、項目を作成、検索、更新、および削除することができます。テーブルを作成、更新、および削除するには、低レベル API を使用する必要があります。低レベル API の使用方法については、「[DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md)」を参照してください。低レベル API は、Amazon.DynamoDB.DocumentModel 名前空間で利用できます。

ドキュメントモデルの詳細については、「[.NET ドキュメントモデル](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKMidLevel.html)」を参照してください。

## DynamoDB クライアントの作成
<a name="create-a-dynamodb-client"></a>

DynamoDB クライアントを作成するには、以下を行います。

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

## CRUD オペレーション
<a name="crud-operations"></a>

### 項目の保存
<a name="save-an-item"></a>

項目の作成:

```
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";
```

項目を DynamoDB テーブルに保存:

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

### 項目の取得
<a name="retrieve-an-item"></a>

項目を取得するには、以下を行います。

```
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);
}
```

### 項目の更新
<a name="update-an-item"></a>

項目を更新するには:

```
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);
}
```

項目を条件付きで更新するには:

```
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);
}
```

### 項目の削除
<a name="delete-an-item"></a>

項目を削除するには:

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

### クエリおよびスキャン
<a name="query-and-scan"></a>

作成者が「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);
  });
}
```

以下のスキャンのサンプルコードでは、テーブルに含まれるすべての本を返します。

```
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);
      });
}
```

# オブジェクト永続性モデルの使用
<a name="dynamodb-integration-objectpersistencemodel"></a>

AWS Mobile SDK for .NET and Xamarin には、クライアント側クラスを DynamoDB テーブルにマッピングできる、オブジェクト永続性モデルが用意されています。各オブジェクトインスタンスが、対応するテーブルの項目にマッピングされます。クライアント側オブジェクトをテーブルに保存するために、オブジェクト永続性モデルでは、DynamoDB のエントリポイントとなる DynamoDBContext クラスを使用できます。このクラスでは、DynamoDB に接続してテーブルにアクセスし、各種の CRUD オペレーションやクエリを実行することができます。

オブジェクト永続性モデルには、テーブルを作成、更新、または削除するための API はありません。データオペレーションだけが可能になっています。テーブルを作成、更新、および削除するには、低レベル API を使用する必要があります。低レベル API の使用方法については、「[DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md)」を参照してください。

## 概要:
<a name="overview"></a>

オブジェクト永続性モデルには、クライアント側クラスをテーブルにマッピングし、プロパティ/フィールドを属性にマッピングする、属性のセットが用意されています。オブジェクト永続性モデルでは、クラスプロパティとテーブル属性との間で、明示的なマッピングとデフォルトのマッピングの両方がサポートされています。
+  **明示的なマッピング**: プライマリキーにプロパティをマッピングするには、オブジェクト永続性モデル属性の DynamoDBHashKey および DynamoDBRangeKey を使用する必要があります。さらに、非プライマリキー属性については、クラス内のプロパティ名と、マッピング先の対応するテーブル属性が同じでない場合は、DynamoDBProperty 属性を明示的に追加してマッピングを定義する必要があります。
+  **デフォルトのマッピング** - デフォルトでは、オブジェクト永続性モデルによって、クラスプロパティがテーブル内の同じ名前の属性にマッピングされます。

すべてのクラスプロパティをマッピングする必要はありません。これらのプロパティを特定するには、DynamoDBIgnore 属性を追加します。オブジェクトのインスタンスを保存して取得すると、この属性でマークされたプロパティはすべて省略されます。

## サポートされるデータ型
<a name="supported-data-types"></a>

オブジェクト永続性モデルでは、プリミティブな .NET データ型、コレクション、および任意のデータ型のセットがサポートされています。このモデルでは、次のプリミティブデータ型がサポートされています。
+ ブール
+ バイト
+ char
+ DateTime
+ 小数点、倍精度浮動小数点型、浮動小数点型
+ Int16、Int32、Int64
+ SByte
+ string
+ UInt16、UInt32、UInt64

オブジェクト永続性モデルでは、次の制限の下で .NET コレクション型もサポートされています。
+ コレクション型は、ICollection インターフェイスを実装する必要があります。
+ コレクション型は、サポートされているプリミティブ型で構成されている必要があります。たとえば、ICollection<string>、ICollection<bool> を参照してください。
+ コレクション型では、パラメータがないコンストラクタを使用できなければなりません。

オブジェクト永続性モデルの詳細については、「[.NET オブジェクト永続性モデル](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html)」を参照してください。

## DynamoDB クライアントの作成
<a name="create-a-dynamodb-client"></a>

DynamoDB クライアントを作成するには、以下を行います。

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

## CRUD オペレーション
<a name="crud-operations"></a>

### オブジェクトの保存
<a name="save-an-object"></a>

オブジェクトを作成します。

```
[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
};
```

DynamoDB テーブルにオブジェクトを保存します。

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

### オブジェクトの取得
<a name="retrieve-an-object"></a>

オブジェクトを取得するには:

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

### オブジェクトを更新
<a name="update-an-object"></a>

オブジェクトを更新するには:

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

### オブジェクトの削除
<a name="delete-an-object"></a>

オブジェクトを削除するには:

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

## クエリおよびスキャン
<a name="query-and-scan"></a>

作成者が「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());
  });
}
```

以下のスキャンのサンプルコードでは、テーブルに含まれるすべての本を返します。

```
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());
  });
}
```

# DynamoDB サービスレベル API を使用する
<a name="dynamodb-integration-lowlevelapi"></a>

Dynamo サービスレベルの API を使用して、テーブルを作成、更新、削除することができます。この API を使用して、テーブル内の項目に対して、一般的な作成、読み込み、更新、削除 (CRUD) のオペレーションを実行することもできます。

## DynamoDB クライアントの作成
<a name="create-a-dynamodb-client"></a>

DynamoDB クライアントを作成するには、以下を行います。

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

## CRUD オペレーション
<a name="crud-operations"></a>

### 項目の保存
<a name="save-an-item"></a>

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);
```

### 項目の取得
<a name="retrieve-an-item"></a>

項目を取得するには、以下を行います。

```
// 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"]);
}
```

### 項目の更新
<a name="update-an-item"></a>

項目を更新するには:

```
// 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);
```

### 項目の削除
<a name="delete-an-item"></a>

項目を削除するには:

```
// 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);
```

## クエリおよびスキャン
<a name="query-and-scan"></a>

作成者が「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);
    });

  }
}
```

以下のスキャンのサンプルコードでは、テーブルに含まれるすべての本を返します。

```
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);
              });
      }
}
```