Azure存储表逐行删除

Kur*_*ula 6 c# azure azure-table-storage cloud-storage

我试图仅通过rowkey值从azure存储过滤器中删除行.但我没有看到删除操作的任何重载,我们只能用rowkey过滤.是否有其他选项可以从azure存储表中删除具有特定rowkey的记录的行?

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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

Gau*_*tri 8

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

但是,建议不要获取实体,RowKey因为它将执行全表扫描.如果您的表大小很小,这可能不是问题,但是当您的表包含大量实体时会出现问题.此外,一个RowKey是在一个独特的Partition表中的,即只能有一个与一个实体PartitionKey/ RowKey组合.换句话说,您可能具有RowKey不同的实体Partitions.因此,当您RowKey仅获取实体时,您可能会获得多个实体.您需要确保删除正确的实体.

  • 不确定您的表是如何设计的,但最好的选择是您不必搜索实体.如果您知道实体的PartitionKey和RowKey,则可以使用它来创建"TableEntity"的实例,然后删除该实体. (2认同)

sno*_*FFF 6

如果您知道 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;
    }
}    
Run Code Online (Sandbox Code Playgroud)


Sir*_*lih 5

如果您的目标是.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;
Run Code Online (Sandbox Code Playgroud)