Azure 存储 table 逐行删除

Azure storage table delete row by row key

我正在尝试仅通过 rowkey 值从 azure 存储过滤器中删除行。 但是我没有看到删除操作有任何过载,我们只能使用 rowkey 进行过滤。对于具有特定 rowkey 的记录,是否有任何替代选项可以从 azure 存储 table 中删除行?

RemoveEntityByRowKey('123456');
public static void RemoveEntityByRowKey(string myRowKey)
        {
            try
            {
                CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 
                       TableOperation delteOperation = TableOperation.Delete(myRowKey);
                table.Execute(delteOperation);
            }
            catch (Exception ex)
            {
                LogError.LogErrorToAzure(ex);
                throw;
            }
        }

行是指记录吗?

TableOperation.Delete 接受一个 Table 实体。看这里:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx

要删除该实体,您必须首先通过指定其 Partition 键 and/or Row 键来检索它。

在此处查看 Table查询 class https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tablequery_methods.aspx

检索后,将其传递给 Delete 方法。

没有方法

TableOperation.Delete(String rowKey)

唯一方法

public static TableOperation delete(final TableEntity entity)

在 TableOperation 中。详情见Get started with Azure Table storage using .NET

要删除实体,您需要 PartitionKeyRowKey (Delete Entity REST API)。所以你需要做的是首先获取匹配 RowKey 的实体。获取此实体后,您应该可以按照答案中所述调用 TableOperation.Delete

但是,不推荐 通过 RowKey 获取实体,因为它会执行完整 Table 扫描。如果您的 table 尺寸很小,这可能不是问题,但如果您的 table 包含大量实体,这将是一个问题。此外,RowKeyPartition 中是唯一的,即在 table 中只能有一个具有 PartitionKey/RowKey 组合的实体。换句话说,您可以在不同的 Partitions 中拥有具有相同 RowKey 的实体。因此,当您仅通过 RowKey 获取实体时,您可能会返回多个实体。您需要确保删除的是正确的实体。

参考弗兰克斯的指点,我发布了答案,以便对面临类似问题的其他人有用。

RemoveEntityByRowKey('123456');
public static void RemoveEntityByRowKey(string myRowKey)
        {
            try
            {
                CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 

   TableQuery<myEntity> query = new TableQuery<myEntity>()
                   .Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, myRowKey));

                foreach (var item in table.ExecuteQuery(query))
                {
                    var oper = TableOperation.Delete(item);
                    table.Execute(oper);                    
                } 
            }
            catch (Exception ex)
            {
                LogErrorToAzure(ex);
                throw;
            }
        }

如果您的目标是 .NET Core,则需要使用 ExecuteQuerySegmentedAsync 方法来执行过滤条件查询。 ExecuteQuery 已弃用。

var cloudTableClient = _cloudStorageAccount.CreateCloudTableClient();
var myTable = cloudTableClient.GetTableReference("MyTable");
var query = new TableQuery<MyEntity>().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "myRowKey"));
var segment = await myTable.ExecuteQuerySegmentedAsync(query, null);
var myEntities = segment.Results;

如果您知道 PartitionKey 和 RowKey,则无需检索整个实体即可将其删除。您可以按如下方式调整您的代码:

public static void RemoveEntityByRowKey(string myRowKey)
{
    try
    {
        var entity = new YourEntity 
        {
            PartitionKey = "partition",
            RowKey = myRowKey,
            ETag = "*"
        }

        CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 
        TableOperation delteOperation = TableOperation.Delete(entity);
        table.Execute(delteOperation);
    }
    catch (Exception ex)
    {
        LogError.LogErrorToAzure(ex);
        throw;
    }
}    

mpl 是我的 table 行实体,需要从数据库中删除记录。 我添加了此答案以显示异步(带结果检查)

           if (result)
            {
                //delete the lead from the storage table
                TableOperation delRow = TableOperation.Delete(mpl);
                TableResult tr = await table.ExecuteAsync(delRow);
                if (((int)tr.HttpStatusCode) < 400)
                    log.LogInformation($"Table Record: {mpl.RowKey} deleted");
                else
                    log.LogError($"Table Record: {mpl.RowKey} NOT deleted");

            }

Windows.Azure.Storage 命名空间现已 弃用 取而代之的是 Azure.Data.Tables 命名空间。因此,TableOperation.Delete 方法 也已弃用 。您现在应该使用 TableClient and it's DeleteEntity 方法:

TableClient tableClient = new TableClient(connectionString, Table);
tableClient.DeleteEntity(PartitionKey, RowKey);

如果您也愿意,还有异步版本DeleteEntityAsync