10

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

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;
            }
        }
4

8 回答 8

11

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

但是,不建议使用fetching entity byRowKey ,因为它会执行 Full Table Scan 。如果您的表尺寸很小,这可能不是问题,但如果您的表包含大量实体,这将是一个问题。此外,a在 a 中RowKey是唯一的,Partition即在表中只能有一个带有PartitionKey/RowKey组合的实体。换句话说,您可能RowKey在不同的Partitions. 因此,当您RowKey仅获取实体时,您可能会返回多个实体。您需要确保删除正确的实体。

于 2016-05-13T05:12:00.207 回答
9

如果您知道 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;
    }
}    
于 2020-03-19T17:14:22.740 回答
4

如果您的目标是 .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;
于 2019-02-06T09:50:36.613 回答
2

行是指记录吗?

TableOperation.Delete 接受一个表实体。请参阅此处:https ://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx

为了删除该实体,您必须首先通过指定其Partition键和/或Row键来检索它。

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

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

于 2016-05-13T04:12:34.197 回答
2

没有方法

TableOperation.Delete(String rowKey),

唯一的方法

public static TableOperation delete(final TableEntity entity)

在表操作中。有关详细信息,请参阅使用 .NET 开始使用 Azure 表存储

于 2016-05-13T04:43:48.153 回答
0

参考 Franks 的指针,我发布了答案,以便对面临类似问题的其他人有用。

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;
            }
        }
于 2016-05-13T05:30:47.700 回答
0

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

           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");

            }
于 2021-09-29T13:38:44.627 回答
0

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

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

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

于 2021-11-02T16:11:59.373 回答