gpt4 book ai didi

c# - 如何从Azure存储表中删除时间戳超过1天的所有实体?

转载 作者:可可西里 更新时间:2023-11-01 09:12:52 25 4
gpt4 key购买 nike

Azure 存储表都有一个时间戳列。基于文档 here列出的从存储表中删除的方法是选择一个实体然后将其删除。

有谁知道如何使用代码根据时间戳值的日期时间比较从存储表中删除任何实体?

编辑:

根据给出的建议,我编写了以下代码。但是,它在我的 table.ExecuteQuery(rangeQuery) 调用上引发错误请求异常。有什么建议吗?

    StorageCredentials creds = new StorageCredentials(logAccountName, logAccountKey);
CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

CloudTableClient client = account.CreateCloudTableClient();

CloudTable table = client.GetTableReference(LogTable);

TableQuery<CloudQuerySummary> rangeQuery = new TableQuery<CloudQuerySummary>()
.Where(TableQuery.GenerateFilterCondition("Timestamp", QueryComparisons.LessThan
, DateTime.Now.AddHours(- DateTime.Now.Hour).ToString()));


TableOperation deleteOperation;
// Loop through the results, displaying information about the entity.
foreach (CloudQuerySummary entity in table.ExecuteQuery(rangeQuery))
{
deleteOperation = TableOperation.Delete(entity);

table.Execute(deleteOperation);
}

编辑2

这是最终的工作代码,供任何选择复制/引用它的人使用。

public void DeleteLogsNotFromToday()
{
StorageCredentials creds = new StorageCredentials(logAccountName, logAccountKey);
CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

CloudTableClient client = account.CreateCloudTableClient();

CloudTable table = client.GetTableReference(LogTable);

TableQuery<CloudQuerySummary> rangeQuery = new TableQuery<CloudQuerySummary>()
.Where(TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThan
, DateTime.Now.AddHours(-DateTime.Now.Hour)));

try
{

TableOperation deleteOperation;
// Loop through the results, displaying information about the entity.
foreach (CloudQuerySummary entity in table.ExecuteQuery(rangeQuery))
{
deleteOperation = TableOperation.Delete(entity);

table.Execute(deleteOperation);
}
}
catch (Exception ex)
{
throw;
}

}

最佳答案

您必须执行分区扫描才能做到这一点,因为实体仅在其 PartitionKey 和 RowKey 上建立索引。

在您发布的教程链接中,查看检索分区中的一系列实体部分。一旦获得要删除的实体,您将执行表操作来删除它们。

如果您不想一一删除它们,可以创建批量删除操作(前提是要删除的所有实体都具有相同的分区键)。上面的链接还指导如何构建批处理操作。

或者,如果您不想进行表扫描,则应该存储日期引用(例如,将以毫秒为单位的日期存储为 RowKey),然后使用它来根据日期时间比较(类似于 THIS )

更新:我认为问题出在这一行:DateTime.Now.AddHours(- DateTime.Now.Hour).ToString()

来自 documentation :

The Timestamp property is a DateTime value that is maintained on the server side to record the time an entity was last modified

您正在尝试将 DateTime 属性与字符串进行比较。我不是 C# 专家,但我认为这不是一个有效的比较。

关于c# - 如何从Azure存储表中删除时间戳超过1天的所有实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com