DynamoDB C#表达式用于查询/扫描

时间:2018-03-12 23:26:55

标签: c# linq amazon-web-services lambda amazon-dynamodb

我有一个使用接口的通用存储库结构,我正在尝试为此开发DynamoDB实现。这是我第一次使用DynamoDB和NoSQL(之前都是T-SQL)。

我遇到的问题是我无法找到将C#中的lambda表达式转换为可用于查询/扫描DynamoDB的格式的任何方法。

我的Get方法如下所示:

public Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> where)
{
    return await this.DataContext.ScanAsync(...);
}

有现成的方法吗?文档中没有任何内容可以解决这个问题,我很难找到其他人遇到类似问题的例子。

也许我缺乏NoSQL和/或DynamoDB的经验只是这里的问题。如果是这样,请在必要时指出一个更好的方法,但我会注意到,如前所述,我正在实现一个已经定义的界面,并且改变这不是一个真正的选择。

1 个答案:

答案 0 :(得分:1)

据我所知,您可以使用ServiceStack.Aws,它与LINQ相似。 例如:

using System;
using Amazon;
using Amazon.DynamoDBv2;
using ServiceStack;
using ServiceStack.Text;
using ServiceStack.Aws.DynamoDb;
using ServiceStack.DataAnnotations;

var awsDb = new AmazonDynamoDBClient("keyId","key",
    new AmazonDynamoDBConfig { ServiceURL="http://localhost:8000"});
var db = new PocoDynamo(awsDb);

public class Todo
{
    [AutoIncrement]
    public long Id { get; set; }
    public string Content { get; set; }
    public int Order { get; set; }
    public bool Done { get; set; }
}

db.RegisterTable<Todo>();

db.DeleteTable<Todo>();  // Delete existing Todo Table (if any)
db.InitSchema();         // Creates Todo DynamoDB Table

var newTodo = new Todo {
    Content = "Learn PocoDynamo",
    Order = 1
};
db.PutItem(newTodo);

var savedTodo = db.GetItem<Todo>(newTodo.Id);
"Saved Todo: {0}".Print(savedTodo.Dump());

savedTodo.Done = true;
db.PutItem(savedTodo);

var updatedTodo = db.GetItem<Todo>(newTodo.Id);
"Updated Todo: {0}".Print(updatedTodo.Dump());

db.DeleteItem<Todo>(newTodo.Id);

var remainingTodos = db.GetAll<Todo>();
"No more Todos: {0}".Print(remainingTodos.Dump());