0

我有一个 azure 函数应用程序,它将基于一个分区键生成多个条目。以防函数执行过程中出现任何错误。我首先删除我的 azure 表上具有相同分区键的所有实体,以防函数 get 重试 2 次或 3 次并插入重复的记录。

所以我决定通过循环一组 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;
        }

如果上面的代码是正确的。是否会出现无限循环,试图删除的数据无法删除,并且一直试图删除。

4

1 回答 1

0

不会。一旦任何批处理操作失败,您的代码就会退出循环。如果删除批处理中的任何实体失败,基本上以下代码行将引发异常。

var result = table.ExecuteBatch(batch);

我在以下代码行中注意到的另一件事:

offset += result.Where(x=>x.HttpStatusCode == (int) HttpStatusCode.NoContent).Count() + offset;

offset当你已经在做的时候,你为什么要在表达式的末尾再次添加offset +=

于 2019-08-07T04:14:02.467 回答