Как удалить все объекты с меткой времени более 1 дня из таблицы хранения Azure?

Все таблицы хранения Azure имеют столбец временной метки. На основе документации здесь перечисленный способ удаления из таблицы хранения - это выбрать объект, а затем удалить его.

Кто-нибудь знает, как удалить любой объект из таблицы хранилища на основе сравнения даты и времени с использованием значения timestamp с помощью кода?

EDIT:

Основываясь на приведенном совете, я написал следующий код. Однако он вызывает исключение Bad Request в моей таблице. Вызов 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);
 }
</cloudquerysummary></cloudquerysummary>

РЕДАКТИРОВАТЬ 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;
 }
}
</cloudquerysummary></cloudquerysummary>
2 ответа

Вам нужно будет выполнить проверку разделов, чтобы сделать это, поскольку объекты индексируются только в своих разделах PartitionKey и RowKey.

В приведенной вами обучающей ссылке просмотрите раздел "Извлечь ряд объектов в разделе". После того, как вы получите объекты, которые хотите удалить, вы затем выполните операцию таблицы, чтобы удалить их.

Если вы не хотите удалять их один за другим, вы можете создать операцию пакетного удаления (при условии, что все удаляемые объекты имеют один и тот же ключ раздела). В приведенной выше ссылке также указывается, как создать пакетную операцию.

В качестве альтернативы, если вы не хотите выполнять сканирование таблицы, вы должны сохранить ссылку на дату (например, сохранить дату в миллисекундах как RowKey), а затем использовать ее для фильтрации объектов, которые необходимо удалить, на основе сопоставление даты и времени (что-то похожее на ЭТО)

ОБНОВЛЕНИЕ: Я думаю, что проблема в этой строке: DateTime.Now.AddHours(- DateTime.Now.Hour).ToString()

Как из документации:

Свойство Timestamp - это значение DateTime, которое поддерживается на стороне сервера для записи времени последнего изменения объекта

Вы пытаетесь сравнить свойство DateTime со строкой. Я не эксперт на С#, но это не выглядит для меня правильным.


Если вы используете Slazure, этот вид работы становится проще, следующий код также должен работать со световой версией.

using SysSurge.Slazure;
using SysSurge.Slazure.Linq;
using SysSurge.Slazure.Linq.QueryParser;
namespace TableOperations
{
 public class LogOperations 
 {
 public static void DeleteOldLogEntities()
 {
 // Get a reference to the table storage, example just uses the development storage
 dynamic storage = new QueryableStorage<dynentity>("UseDevelopmentStorage=true");
 // Get a reference to the table named "LogTable"
 QueryableTable<dynentity> logTable = storage.LogTable;
 var query = logTable.Where("Timestamp > @0", DateTime.UtcNow.AddDays(-1));
 // Delete all returned log entities
 foreach (var entity in query)
 logTable.Delete(entity.PartitionKey, entity.RowKey);
 }
 }
}
</dynentity></dynentity>

Полное раскрытие: Я закодировал Slazure.

licensed under cc by-sa 3.0 with attribution.