.net 如何用DynamoDBContext加载和包含排序键?

z4bn682m  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(185)

在使用dynamodb进行实验时,我遇到了以下问题:

var request = new QueryRequest
            {
                TableName = "vs-configurator-engine-back-table",
                KeyConditionExpression = "HashKey = :key and begins_with(SortKey, :sortKey)",
                ExpressionAttributeValues = new Dictionary<string, Amazon.DynamoDBv2.Model.AttributeValue>  {
                {":key", new Amazon.DynamoDBv2.Model. AttributeValue { S =  key }},
                {":sortKey", new Amazon.DynamoDBv2.Model. AttributeValue { S =  sort }},
                },
            };

其中键和排序:

var key = "modelyear#specialParam#Id#year#metadata";
string sort = "ruleset#";

这工作,但我不喜欢当阅读数据时,我必须检索如下值:

response.Items[0].TryGetValue("MyProp", out AttributeValue propOut);

我习惯了.NET到Mysql的世界,在那里我可以得到一个对象类作为结果,所以我尝试了这种方法:

[DynamoDBTable("myCoolTable")]
public class MyObject
{
    [DynamoDBHashKey]
    public string HashKey { get; set; }
    public string SortKey { get; set; }
    [DynamoDBProperty]
    public DateTime activeFrom { get; set; }
    [DynamoDBProperty]
    public Guid id { get; set; }
}

public async Task<DateTime> GetData()
{
    AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();

    AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);

    DynamoDBContext context = new DynamoDBContext(client);
    MyObject obj = context.Load<MyObject>("modelyear#specialParam#Id#year#metadata");
}

执行此操作时,我收到一个错误:
无法转换属性SortKey的范围键值
我试图找出如何将sortkey发送到查询中,但也不太理解错误消息。
我希望将sorkey发送到查询中,但也能够在检索到它之后转换它的值。

00jrzges

00jrzges1#

Load方法用于从表中检索单个项,因此需要提供整个主键、散列和范围键。
在后台,Load方法实际上是从原生AWS DynamoDB API调用GetItem操作,这意味着您不能使用begins_with或任何其他函数。
您需要使用Query,例如:

DynamoDBContext context = new DynamoDBContext(client);

string replyId = "DynamoDB#DynamoDB Thread 1"; //Partition key
DateTime twoWeeksAgoDate = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Date to compare.
IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate);

相关问题