private async Task<int> GetSourceRootVersion(CloudTable table, string sourceId) { var loadRootQuery = new TableQuery().Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sourceId), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, SourceRootRowKey))); var query = await table.ExecuteQueryAsync(loadRootQuery); var sourceRootEntity = query.First(); return sourceRootEntity.Properties["Version"].Int32Value.Value; }
private async Task SyncTableSince(CloudTable table, DateTimeOffset timestamp) { var query = new TableQuery<DynamicTableEntity> { FilterString = TableQuery.GenerateFilterConditionForDate("Timestamp", "gt", timestamp), }; IList<DynamicTableEntity> allFuckingEntities = await table.ExecuteQueryAsync( query, _token, list => Console.WriteLine("loaded {0} rows", list.Count)); CloudTable dstTable = _dstClient.GetTableReference(table.Name); await dstTable.CreateIfNotExistsAsync(); int n = 0; DateTimeOffset maxSourceTs = timestamp; foreach (var batch1 in allFuckingEntities.GroupBy(x => x.PartitionKey)) { if (_token.IsCancellationRequested) return; foreach (var batch2 in batch1.Batch(100)) { if (_token.IsCancellationRequested) return; var op = new TableBatchOperation(); foreach (DynamicTableEntity entity in batch2) { op.InsertOrReplace(entity); if (entity.Timestamp > maxSourceTs) { maxSourceTs = entity.Timestamp; } } await dstTable.ExecuteBatchAsync(op, _token); n += Math.Min(op.Count, 100); Console.WriteLine("sent {0} rows", n); } } _timestamps[table] = maxSourceTs; }