/// /// Create a query that will scan the assigned range and save it to a blob in the given container /// private static void BackupTableRange( CloudTableClient tableClient, CloudBlobContainer container, string tableName, PartitionKeyRange range, string backupId) { TableServiceContext context = tableClient.GetDataServiceContext(); context.MergeOption = MergeOption.NoTracking; context.ResolveType = TableBackup.ResolveType; context.ReadingEntity += new EventHandler(TableBackup.OnReadingEntity); context.RetryPolicy = RetryPolicies.RetryExponential(5, RetryPolicies.DefaultClientBackoff); var query = from entity in context.CreateQuery(tableName) select entity; if (range.Min != null) { query = query.Where(entity => entity.PartitionKey.CompareTo(range.Min) >= 0); } if (range.Max != null) { query = query.Where(entity => entity.PartitionKey.CompareTo(range.Max) < 0); } CloudTableQuery cloudQuery = new CloudTableQuery((DataServiceQuery)query); BackupToContainer(container, cloudQuery, backupId, range); } /// /// Entities used for backup/restore /// [DataServiceKey("PartitionKey", "RowKey")] public class BackupEntity { public string PartitionKey { get; set; } public string RowKey { get; set; } /// /// Used during restore to store the entry element. /// internal XElement EntryElement { get; set; } } static void OnReadingEntity(object sender, ReadingWritingEntityEventArgs args) { BackupEntity entity = args.Entity as BackupEntity; entity.EntryElement = args.Data; } static Type ResolveType(string entityName) { return typeof(BackupEntity); } |