如何解决DynamoDB扫描时的Cannot specify the AttributesToGet异常?
解决DynamoDB扫描时"Cannot specify the AttributesToGet when choosing to get ALL_ATTRIBUTES"异常
这个问题我之前也碰到过,核心原因是你设置的AttributesToGet和SDK默认的Select配置冲突了——当创建ScanOperationConfig时,如果没有显式指定Select属性,SDK会默认用Select.AllAttributes(也就是获取所有列),但你又同时指定了AttributesToGet(只获取特定列),这两个配置互斥,所以抛出了异常。
这里有两种可行的解决办法:
方法一:显式指定Select为SpecificAttributes
直接在ScanOperationConfig中添加Select = Select.SpecificAttributes,让SDK明确知道你要获取指定列,和AttributesToGet的配置匹配:
string tableName = "Thread"; Table ThreadTable = Table.LoadTable(client, tableName); ScanFilter scanFilter = new ScanFilter(); scanFilter.AddCondition("ForumId", ScanOperator.Equal, forumId); scanFilter.AddCondition("Tags", ScanOperator.Contains, "sortkey"); // 修改后的配置 ScanOperationConfig config = new ScanOperationConfig() { AttributesToGet = new List<string> { "Subject", "Message" }, Filter = scanFilter, Select = Select.SpecificAttributes // 新增这一行 }; Search search = ThreadTable.Scan(config);
方法二:使用ProjectionExpression替代AttributesToGet(推荐)
AttributesToGet是比较旧的参数,AWS官方更推荐用ProjectionExpression来指定要返回的列,它支持更灵活的投影规则(比如嵌套属性、别名等),而且不需要额外设置Select属性,SDK会自动识别:
string tableName = "Thread"; Table ThreadTable = Table.LoadTable(client, tableName); ScanFilter scanFilter = new ScanFilter(); scanFilter.AddCondition("ForumId", ScanOperator.Equal, forumId); scanFilter.AddCondition("Tags", ScanOperator.Contains, "sortkey"); // 使用ProjectionExpression的配置 ScanOperationConfig config = new ScanOperationConfig() { ProjectionExpression = "Subject, Message", // 指定要返回的列 Filter = scanFilter }; Search search = ThreadTable.Scan(config);
两种方法都能解决问题,更建议使用第二种方式,因为它是DynamoDB当前推荐的用法,扩展性更强。
内容的提问来源于stack exchange,提问作者ronenfe
相关产品推荐
相关产品推荐

