我有一个azure函数应用程序,它将基于一个分区键生成多个条目。如果函数执行期间发生任何错误。我首先删除了Azure表上具有相同分区键的所有实体,以防该函数第二次或第三次重试并插入重复的记录。
因此,我决定通过遍历一组100多个实体来使用ExcuteBatch操作。
我不确定TableBatch将返回什么。是否返回所有成功删除结果?
这是我在现阶段所写的。
var projectionQuery = new TableQuery()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "partitionKey"))
.Select(new[] { "RowKey" });
var entities = table.ExecuteQuery(projectionQuery).ToList();
var offset = 0;
while (offset < entities.Count)
{
var batch = new TableBatchOperation();
var rows = entities.Skip(offset).Take(100).ToList();
foreach (var row in rows)
{
batch.Delete(row);
}
var result = table.ExecuteBatch(batch);
offset += result.Where(x=>x.HttpStatusCode == (int) HttpStatusCode.NoContent).Count() + offset;
}
如果以上代码正确。会有一个无限循环,其中尝试删除的数据无法删除,并且一直尝试删除。
答案 0 :(得分:0)
不。一旦任何批处理操作失败,您的代码将退出循环。如果删除批处理中的任何实体失败,基本上遵循以下代码行将引发异常。
var result = table.ExecuteBatch(batch);
我在下面的代码行中注意到了另一件事:
offset += result.Where(x=>x.HttpStatusCode == (int) HttpStatusCode.NoContent).Count() + offset;
为什么已经做offset
时又在表达式的末尾再次添加offset +=
?