如何在PocoDynamo中使用null字段创建QueryExpression

时间:2016-06-29 21:13:40

标签: c# servicestack amazon-dynamodb pocodynamo

我想在范围键为空时查询GSI。我有这个代码,但它抛出异常

IPocoDynamo dbDynamo = new PocoDynamo(new AmazonDynamoDBClient());
var queryExpression = dbDynamo.FromQueryIndex<IndexName>(x => x.InvalidFrom == (DateTime?)null);
var response = dbDynamo.Query(queryExpression);

我的模型看起来像这样

[References(typeof(IndexName))]
[Alias("TableName")]
public class Child
{
   [AutoIncrement]
   public int ChildId { get; set; }

   public int ParentId { get; set; }
   public string Key { get; set; }
   public DateTime? InvalidFrom { get; set; }
   public decimal Value { get; set; }
}

这是我的索引

public class IndexName: IGlobalIndex<Child>
{
   [HashKey]
   public int ParentId { get; set; }

   [RangeKey]
   public DateTime? InvalidFrom { get; set; }

   public int ChildId { get; set; }
}

我做错了什么?

由于

2 个答案:

答案 0 :(得分:3)

首先,当您使用查询时,您始终需要在查询中提供哈希值,因此它至少需要:

var q = dbDynamo.FromQueryIndex<IndexName>(x => 
    x.ParentId = parentId && x.InvalidFrom == (DateTime?)null);

但是尝试插入没有InvalidFrom值的项目,例如:

db.PutItem(new Child { ParentId = 2, Key = "Key2", Value = 2 });

Child没有全局索引时会成功,但如果IndexName包含可为空的DateTime?范围键,则会失败:

Invalid attribute value type

基本上AWS不会让你在全局索引范围键上定义时插入NULL值,但它会让你在非RangeKey属性上插入NULL值。所以不支持这种用例。

答案 1 :(得分:1)

PocoDynamo现在支持它的价值.net core