如何在PocoDynamo中创建一个具有null字段的QueryExpression

本文关键字:一个 null 字段 QueryExpression PocoDynamo 创建 | 更新日期: 2023-09-27 17:53:08

当范围键为null时,我希望通过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; }
}

我做错了什么?

感谢

如何在PocoDynamo中创建一个具有null字段的QueryExpression

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

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包含可为null的DateTime?范围密钥时将失败,其中包含:

Invalid attribute value type

本质上,当在全局索引范围键上定义NULL值时,AWS不会允许您插入该值,但它会允许您在非RangeKey属性上插入NULL值。因此不支持此用例。

就其价值而言,PocoDynamo现在支持.net核心