У меня есть две таблицы в моей DynamoDB:
[DynamoDBTable("TVShow")]
public class TVShow
{
[DynamoDBHashKey]
public string Id { get; set; }
[DynamoDBRangeKey]
public long Timestamp { get; set; }
[DynamoDBProperty]
public string Title { get; set; }
[DynamoDBProperty]
public double Rate { get; set; }
[DynamoDBProperty("Episodes")]
public List<Episode> Episodes { get; set; }
}
[DynamoDBTable("Episode")]
public class Episode
{
[DynamoDBHashKey]
public string Id { get; set; }
[DynamoDBRangeKey]
public long Timestamp { get; set; }
[DynamoDBProperty]
public string Title { get; set; }
}
Пример данных:
{
"Episodes": {
"L": [
{
"M": {
"Id": {
"S": "8ab47e73-188c-43e5-8010-1e22a982bb28"
},
"Timestamp": {
"N": "636830978394004950"
},
"Title": {
"S": "First Episode"
}
}
},
{
"M": {
"Id": {
"S": "c477e288-37d1-4d7f-9104-9b72ed304808"
},
"Timestamp": {
"N": "636830978394669182"
},
"Title": {
"S": "Second Episode"
}
}
}
]
},
"Id": {
"S": "466d8a18-f998-49b3-a299-90b508dba045"
},
"Rate": {
"N": "9.3"
},
"Timestamp": {
"N": "636830978390056778"
},
"Title": {
"S": "Vikings"
}
}
Id: HASH | Ключ перегородки
Метка времени: RANGE | Ключ сортировки
И я хочу получить вложенный объект «Эпизод первый» TVShow по идентификатору [Эпизод].
Я пробовал много способов получить данные. Но не сработало. Это мои источники. Эти документы не актуальны. Я использую пакет nuget AWSSDK.DynamoDBv2 v3.3.16.5.
Запрос таблиц и индексов: .NET
https://docs.aws.amazon.com/en_us/amazondynamodb/latest/developerguide/LowLevelDotNetQuerying.html
Сканирование таблиц и индексов: .NET
https://docs.aws.amazon.com/en_us/amazondynamodb/latest/developerguide/LowLevelDotNetScanning.html
// I can get the TVShow by Id with this.
var scanRequest = new ScanRequest(nameof(TVShow))
{
FilterExpression = "Id = :Id",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{":Id", new AttributeValue {S = "466d8a18-f998-49b3-a299-90b508dba045"}}
}
};
// In the document scan is not async but in v3.3.16.5 scan is async.
var scanResponse = await Client.ScanAsync(scanRequest);
// I can get the TVShow by Id with this.
var queryRequest = new QueryRequest(nameof(TVShow))
{
KeyConditionExpression = "Id = :Id",
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{":Id", new AttributeValue {S = "466d8a18-f998-49b3-a299-90b508dba045"}}
}
};
// In the document query is not async but in v3.3.16.5 query is async.
var queryResponse = await Client.QueryAsync(queryRequest);
Здесь все в порядке. Но, как я уже сказал, я хочу фильтровать по идентификатору вложенного объекта или другому полю, например, заголовку. Каков наилучший способ для этого? Если это возможно как класс таблицы.