コード例 #1
0
        private async Task <List <TableOperation> > BuildTableOperationUpdate(T entity)
        {
            var entityIdValues = EntityDefinition.GetIdValues(entity);
            var idString       = string.Join(StorageQueryBuilder.PARTITION_FIELD_SEPARATOR,
                                             entityIdValues.Select(StorageQueryBuilder.NormalizeStringValue));

            var serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity));

            var fields = GetEntityFilterableFields(entity);

            var record = GenerateRecordMainPartition(entity, serializedField, fields);

            List <TableOperation> operations = new List <TableOperation>
            {
                TableOperation.Replace(record)
            };

            var old = await GetById(idString).ConfigureAwait(false);

            if (old != null)
            {
                var oldFields = GetEntityFilterableFields(old);
                operations.AddRange(GeneratePersistPartitionData(old, null, oldFields).Select(TableOperation.Delete));
            }
            return(operations);
        }
コード例 #2
0
        private async Task <List <TableOperation> > BuildTableOperationUpsert(T entity)
        {
            var entityId        = EntityDefinition.GetIdValues(entity);
            var serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity));
            var fields          = GetEntityFilterableFields(entity).ToList();
            var record          = GenerateRecordMainPartition(entity, serializedField, fields);

            List <TableOperation> operations = new List <TableOperation>
            {
                TableOperation.InsertOrReplace(record)
            };

            operations.AddRange(GeneratePersistPartitionData(entity, serializedField, fields)
                                .Select(TableOperation.InsertOrReplace));
            var idValue = string.Join(StorageQueryBuilder.PARTITION_FIELD_SEPARATOR,
                                      entityId.Select(StorageQueryBuilder.NormalizeStringValue));

            var old = await GetById(StorageQueryBuilder.GetTableKeyNormalizedValue(idValue)).ConfigureAwait(false);

            if (old != null)
            {
                var oldFields = GetEntityFilterableFields(old);
                IEnumerable <TableOperation> deleteOperations = GeneratePersistPartitionData(old, null, oldFields)
                                                                .Select(TableOperation.Delete)
                                                                .Where(d => !operations.Any(o =>
                                                                                            o.Entity.PartitionKey == d.Entity.PartitionKey && o.Entity.RowKey == d.Entity.RowKey))
                                                                .ToList();
                operations.AddRange(deleteOperations);
            }
            return(operations);
        }
コード例 #3
0
        public static TableStorageQueryContext Create(string serializedContext, int?pageSize = null)
        {
            var result = BSonConvert.DeserializeFromBase64String <TableStorageQueryContext>(serializedContext);

            if (pageSize.HasValue)
            {
                result.ContinuationInfo.PageSize = pageSize.Value;
            }
            return(result);
        }
コード例 #4
0
        private byte[] ComputeDefinitionHash()
        {
            var bsonDefinition = BSonConvert.SerializeObject(EntityDefinition);

            using (var sha1Hash = SHA1.Create())
            {
                byte[] data = sha1Hash.ComputeHash(bsonDefinition);
                return(data);
            }
        }
コード例 #5
0
        private async Task <StorageQueryResult <T> > ExecuteQueryAsync(TableStorageQueryContext queryContext)
        {
            var table = await TableAsync().ConfigureAwait(false);

            var result = await table.ExecuteQuerySegmentedAsync(queryContext.ContinuationInfo.Query, queryContext.ContinuationInfo.ContinuationToken).ConfigureAwait(false);

            queryContext.ContinuationInfo.ContinuationToken = result.ContinuationToken;
            queryContext.ContinuationInfo.HasMoreResult     = result.ContinuationToken != null;
            var records = result.Results.Select(d => BSonConvert.DeserializeObject <T>(d.Properties["Content"].BinaryValue));

            return(new StorageQueryResult <T>
            {
                QueryContext = BSonConvert.SerializeToBase64String(queryContext),
                Records = records,
                HasMoreResult = queryContext.HasMoreResult
            });
        }
コード例 #6
0
        private StorageQueryResult <T> ExecuteQuery(TableStorageQueryContext queryContext)
        {
            var table             = Table();
            var continuationInfos = new List <TableStorageContinuationInfo>();

            var result = table.ExecuteQuerySegmented(queryContext.ContinuationInfo.Query, queryContext.ContinuationInfo.ContinuationToken);

            queryContext.ContinuationInfo.ContinuationToken = result.ContinuationToken;
            queryContext.ContinuationInfo.HasMoreResult     = result.ContinuationToken != null;
            var records = result.Results.Select(d => BSonConvert.DeserializeObject <T>(d.Properties["Content"].BinaryValue));

            return(new StorageQueryResult <T>
            {
                Contexts = BSonConvert.SerializeToBase64String(queryContext),
                Records = records,
                HasMoreResult = queryContext.HasMoreResult
            });
        }
コード例 #7
0
        private List <TableOperation> BuildTableOperationInsert(T entity)
        {
            List <KeyValuePair <string, EntityProperty> > fields = GetEntityFilterableFields(entity).ToList();

            EntityProperty serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity));

            var record = GenerateRecordMainPartition(entity, serializedField, fields);
            List <TableOperation> operations = new List <TableOperation>
            {
                TableOperation.Insert(record)
            };

            foreach (var partitionRecord in GeneratePersistPartitionData(entity, serializedField, fields))
            {
                operations.Add(TableOperation.Insert(partitionRecord));
            }

            return(operations);
        }