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())); }
public static Func <Task <T> > GetLookupDelegate <T>(MemberInfo memberInfo, string rowKey, string partitionKey, IProvideEntity entityProvider) { var repository = AzureTableDriverDynamic.FromSettings(); var tableName = StorageLookupAttribute.GetMemberTableName(memberInfo); // var tableRef = repository.TableClient.GetTableReference(tableName); Func <Task <T> > lookupDelegate = () => repository.FindByIdAsync <T, T>(rowKey, partitionKey, onFound: (resource, tr) => resource, onNotFound: () => { if (typeof(T).IsArray) { return((T)typeof(T) .GetElementType() .ConstructEmptyArray()); } return(default(T)); }, tableName: tableName, entityProvider: entityProvider); return(lookupDelegate); }