【以下的问题经过翻译处理】 我有一个包含七个记录的数据集:
我想返回在12月14日至12月20日之间的所有记录,并按照每页两条的方式进行分页。这是我的第一个调用,请求结果的第一页:
Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
Dictionary<string, string> expressionAttributeNames = new Dictionary<string, string>();
string filterExpression = string.Empty;
AmazonDynamoDBClient client = new Amazon.DynamoDBv2.AmazonDynamoDBClient(creds);
List<RecordingMetaData> recordings = new List<RecordingMetaData>();
expressionAttributeValues.Add(":startTime", new AttributeValue { S = $"2022-12-14" });
expressionAttributeValues.Add(":endTime", new AttributeValue { S = $"2022-12-20" });
filterExpression = $"#start > :startTime AND #start <= :endTime";
expressionAttributeNames.Add("#start", "StartTime");
ScanRequest scanRequest = new ScanRequest()
{
TableName = "SCRecordingMetaData",
ExpressionAttributeNames = expressionAttributeNames,
FilterExpression = filterExpression.Length > 0 ? filterExpression : null,
ExpressionAttributeValues = expressionAttributeValues,
Limit = 2
};
var response = new ScanResponse();
do
{
response = client.Scan(scanRequest);
response.Items.ForEach(i => recordings.Add(new RecordingMetaData()
{
RecordingID = i["RecordingID"].S,
Duration = Convert.ToInt32(i["Duration"].N),
StartTime = Convert.ToDateTime(i["StartTime"].S),
EndTime = Convert.ToDateTime(i["EndTime"].S),
ANI = i["ANI"].S,
DNS = i["DNS"].S,
CreatedTime = Convert.ToDateTime(i["CreatedTime"].S),
FilePath = i["FilePath"].S,
AgentIDs = i.ContainsKey("AgentIDs") ? i["AgentIDs"].L : null,
QueueIDs = i.ContainsKey("QueueIDs") ? i["QueueIDs"].L : null
}));
}
while (response.LastEvaluatedKey.Count > 1);
在请求中未设置限制时,它应该并且确实会返回3条记录。当将限制设置为2时,我期望第一页返回2个结果,并且最后评估键(LastEvaluatedKey)应为"5dcb2cd5-ddcc-41d8-b147-ec2aa95883ad",因为这是列表中满足筛选条件的第二个键。然而,实际上只返回了一个结果,即"2a45d769-fc43-4325-96ec-76e5cf0750fe",而且这也是最后评估键。如果我将此值传递给下一次调用的ExclusiveStartKey,虽然最后评估键为"8bce9df3-3921-4259-a70a-c9cf6d34f61f",但却返回0个结果。
因此,看起来发生的情况是它只返回满足筛选条件的记录,但在某种程度上仍然识别出其他尚未返回的记录仍然存在,即第一个未应用搜索筛选的记录集应包括"8c8c7afb-e529-4cb5-adb2-ab79d51f5741"和"2a45d769-fc43-4325-96ec-76e5cf0750fe",但由于筛选,它只返回一条记录"2a45d769-fc43-4325-96ec-76e5cf0750fe"。显然,应该返回"2a45d769-fc43-4325-96ec-76e5cf0750fe"和"5dcb2cd5-ddcc-41d8-b147-ec2aa95883ad"。
在出现这种行为的情况下,如何编写任何类型的分页呢?