我有一个使用接口的通用存储库结构,我正在尝试为此开发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的经验只是这里的问题。如果是这样,请在必要时指出一个更好的方法,但我会注意到,如前所述,我正在实现一个已经定义的界面,并且改变这不是一个真正的选择。
答案 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());