public async Task <TResult> ExecuteUpdateAsync <TEntity, TResult>(MemberInfo memberInfo,
                                                                          IAzureStorageTableEntity <TEntity> updatedEntity, IAzureStorageTableEntity <TEntity> existingEntity,
                                                                          AzureTableDriverDynamic repository,
                                                                          Func <Func <Task>, TResult> onSuccessWithRollback,
                                                                          Func <TResult> onFailure)
        {
            var newValue      = memberInfo.GetValue(updatedEntity.Entity);
            var existingValue = memberInfo.GetValue(updatedEntity.Entity);

            if (newValue.GetType().IsAssignableTo(typeof(System.Delegate)))
            {
                var dele     = (Delegate)newValue;
                var deleType = dele.Target.GetType();
                if (deleType.DeclaringType.GUID == typeof(StorageSubtableAttribute).GUID)
                {
                    return(onSuccessWithRollback(() => true.AsTask()));
                }
            }

            var rowKeyRef       = updatedEntity.RowKey;
            var partitionKeyRef = updatedEntity.PartitionKey;

            var memberType  = typeof(TEntity);
            var taskValue   = newValue.ExecuteFunction(out Type taskType);
            var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave);

            var rawValues = Serialize(resultValue, typeToSave);

            ITableEntity subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues);
            var          tableName      = StorageLookupAttribute.GetMemberTableName(memberInfo);
            var          tableRef       = repository.TableClient.GetTableReference(tableName);

            return(await repository.InsertOrReplaceAsync(subtableEntity, new E5CloudTable(tableRef),
                                                         (created, tr) => onSuccessWithRollback(() => 1.AsTask())));
        }
        public async Task <TResult> ExecuteCreateAsync <TEntity, TResult>(MemberInfo memberInfo,
                                                                          string rowKeyRef, string partitionKeyRef, TEntity value, IDictionary <string, EntityProperty> dictionary,
                                                                          AzureTableDriverDynamic repository,
                                                                          Func <Func <Task>, TResult> onSuccessWithRollback,
                                                                          Func <TResult> onFailure)
        {
            var memberType  = typeof(TEntity);
            var taskValue   = value.ExecuteFunction(out Type taskType);
            var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave);

            var rawValues = Serialize(resultValue, typeToSave);

            var subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues);
            var tableName      = StorageLookupAttribute.GetMemberTableName(memberInfo);
            var tableRef       = repository.TableClient.GetTableReference(tableName);

            return(await repository.CreateAsync(subtableEntity, new E5CloudTable(tableRef),
                                                (discard, discard2) => onSuccessWithRollback(() => 1.AsTask()),
                                                onAlreadyExists : () => onFailure()));
        }