为什么 IEnumerable.Where() 在 DynamoDBContext.Scan() 结果中找不到我的对象?
Why doesn't IEnumerable.Where() find my objects in DynamoDBContext.Scan() results?
在 C# 中使用 AWS DynamoDB "Object Persistence Model" 时,运行 遇到一个有趣的问题;扫描操作的解析结果。在下面的代码中,我在 Datastore.userIndicators 中的条目(这是一个包含对象列表的字典,由用户名索引)总是空列表。
var allIndicators = context.Scan<Indicator>();
Datastore.globalIndicators = allIndicators.Where(i => i.UserName == "*").ToList();
var userDefinedIndicators = allIndicators.Where(i => i.UserName != "*");
foreach (var username in userDefinedIndicators.Select(i => i.UserName).Distinct())
{
Datastore.userIndicators[username] = userDefinedIndicators.Where(i => i.DynamoDbRangeKey.StartsWith(username)).ToList();
}
因此,例如,如果我 table 中的条目包含属性 "UserName" 且值为 "userA",当 运行 此代码字典 "Datastore.userIndicators" 将以键 "userA" 的条目结束,但相应的值将是一个空列表。
在摆弄这个并跟随直觉之后,我修改了
的赋值
var allIndicators = context.Scan<Indicator>();
到
var allIndicators = context.Scan<Indicator>().ToList();
瞧!
事实证明(由AWS SDK documentation确认),DynamoDBContext.Scan()方法的return是延迟加载。调用 .ToList() 强制枚举并加载所有结果。
在 C# 中使用 AWS DynamoDB "Object Persistence Model" 时,运行 遇到一个有趣的问题;扫描操作的解析结果。在下面的代码中,我在 Datastore.userIndicators 中的条目(这是一个包含对象列表的字典,由用户名索引)总是空列表。
var allIndicators = context.Scan<Indicator>();
Datastore.globalIndicators = allIndicators.Where(i => i.UserName == "*").ToList();
var userDefinedIndicators = allIndicators.Where(i => i.UserName != "*");
foreach (var username in userDefinedIndicators.Select(i => i.UserName).Distinct())
{
Datastore.userIndicators[username] = userDefinedIndicators.Where(i => i.DynamoDbRangeKey.StartsWith(username)).ToList();
}
因此,例如,如果我 table 中的条目包含属性 "UserName" 且值为 "userA",当 运行 此代码字典 "Datastore.userIndicators" 将以键 "userA" 的条目结束,但相应的值将是一个空列表。
在摆弄这个并跟随直觉之后,我修改了
的赋值var allIndicators = context.Scan<Indicator>();
到
var allIndicators = context.Scan<Indicator>().ToList();
瞧!
事实证明(由AWS SDK documentation确认),DynamoDBContext.Scan()方法的return是延迟加载。调用 .ToList() 强制枚举并加载所有结果。