Windows Azure表存储中的批量删除 [英] Batch delete in Windows Azure Table Storage

查看:178
本文介绍了Windows Azure表存储中的批量删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试删除WADLogsTable中2个日期(即2个分区键)之间的所有实体. 到目前为止,我发现的最好的代码就是这个代码(来自

I'm trying to delete all entities between 2 dates (i.e. 2 partition keys) in the WADLogsTable. So far, the best code I've found is this one (from http://wintellect.com/blogs/jlane/deleting-entities-in-windows-azure-table-storage):

private static void DeleteAllEntitiesInBatches(CloudTable table, Expression<Func<DynamicTableEntity, bool>> filters)
        {
            Action<IEnumerable<DynamicTableEntity>> processor = entities =>
            {
                var batches = new Dictionary<string, TableBatchOperation>();

                foreach (var entity in entities)
                {
                    TableBatchOperation batch = null;

                    if (batches.TryGetValue(entity.PartitionKey, out batch) == false)
                    {
                        batches[entity.PartitionKey] = batch = new TableBatchOperation();
                    }

                    batch.Add(TableOperation.Delete(entity));

                    if (batch.Count == 100)
                    {
                        table.ExecuteBatch(batch);
                        batches[entity.PartitionKey] = new TableBatchOperation();
                    }
                }

                foreach (var batch in batches.Values)
                {
                    if (batch.Count > 0)
                    {
                        table.ExecuteBatch(batch);
                    }
                }
            };

            ProcessEntities(table, processor, filters);
        }

        private static void ProcessEntities(CloudTable table, Action<IEnumerable<DynamicTableEntity>> processor, Expression<Func<DynamicTableEntity, bool>> filters)
        {
            TableQuerySegment<DynamicTableEntity> segment = null;

            while (segment == null || segment.ContinuationToken != null)
            {
                if (filters == null)
                {
                    segment = table.ExecuteQuerySegmented(new TableQuery().Take(100), segment == null ? null : segment.ContinuationToken);
                }
                else
                {
                    var query = table.CreateQuery<DynamicTableEntity>().Where(filters).Take(100).AsTableQuery();
                    segment = query.ExecuteSegmented(segment == null ? null : segment.ContinuationToken);
                }

                processor(segment.Results);
            }
        }

但是我不知道我应该通过什么作为过滤器"参数. 我想出了一个相当幼稚的尝试:

But I don't know what I should pass as the "filters" parameter. I came up with this rather naive attempt:

Expression<Func<DynamicTableEntity, bool>> filters = e => long.Parse(e.PartitionKey) >= startTicks && long.Parse(e.PartitionKey) <= endTicks;

但这不起作用.在运行时,出现以下错误:

But that doesn't work. At runtime, I get the following error:

表达式((Parse([10007] .PartitionKey)> = 635109048000000000) 并且(Parse([10007] .PartitionKey)< = 635115960000000000))不是 支持.

The expression ((Parse([10007].PartitionKey) >= 635109048000000000) And (Parse([10007].PartitionKey) <= 635115960000000000)) is not supported.

我不知道我的问题是否与Azure表或Expression有关,但是任何帮助将不胜感激.

I don't know if my problem is related to Azure tables or Expression but any help will be appreciated.

编辑:如果需要,我很乐意提供更多信息.

I'd be happy to provide with more info if needed.

推荐答案

我在另一个论坛上得到了答案:

I got an answer on another forum:

var startTicks = string.Format("{0:0000000000000000000}", start);
var endTicks = string.Format("{0:0000000000000000000}", end);
Expression<Func<DynamicTableEntity, bool>> filters = e => e.PartitionKey.CompareTo(startTicks) >= 0 && e.PartitionKey.CompareTo(endTicks) <= 0;

这篇关于Windows Azure表存储中的批量删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆