Удаление старых записей журнала хранения таблиц Azure, созданных с помощью семантической регистрации

Я реализовал семантическое ведение журнала для записи записей в хранилище таблицы Azure. Теперь я хочу удалить старые записи журнала (скажем, старше 30 дней) из таблицы Azure. Проблема заключается в том, что partitionKeys и RowKeys в таблице Azure генерируются динамически. Что-то вроде этого

PartitionKey         RowKey

2519569987199999999  MyProjectName_2519569788418593594_FFFFFFF8 //entry date 20 october 2015
2519573205599999999  MyProjectName_2519573006928838932_FFFFFFE1 // entry date 16 october 2015

Я исследовал и обнаружил, что PartitionKey имеет формат DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks

Как я могу получить данные из таблицы для удаления? Нужно ли выполнять полное сканирование таблицы, так как partitionKey является динамическим?

1 ответ

Решение

Как я могу получить данные из таблицы для удаления? Нужно ли выполнять полное сканирование таблицы, так как partitionKey является динамическим?

Нет, вам не нужно делать полное сканирование таблицы. Вот как вы можете узнать сущности, созданные до 30 дней.

        var today = DateTime.UtcNow.Date;
        var thirtyDaysFromToday = today.AddDays(-30);
        var pk = (DateTime.MaxValue.Ticks - thirtyDaysFromToday.Ticks).ToString();
        var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
        var tableClient = account.CreateCloudTableClient();
        var table = tableClient.GetTableReference("YourTableName");
        TableQuery query = new TableQuery().Where("PartitionKey ge '" + pk + "'").Select(new List<string>(){"PartitionKey", "RowKey"});//Since you only need PartitionKey/RowKey for entities deletion thus just fetch that only
        TableContinuationToken token = null;
        do
        {
            var queryResult = table.ExecuteQuerySegmented(query, token);
            token = queryResult.ContinuationToken;
            var entities = queryResult.Results;
            //Now you can delete those entities
        }
        while (token != null);

Примечание: я не тестировал код, поэтому, пожалуйста, попробуйте сначала с меньшим набором данных, прежде чем делать все возможное:)

Другие вопросы по тегам