async Task ImportSingleRecordAsync( ImportingJob importingTask, ImportingTaskContext context, IRecordFinder recordFinder, IRecordImporter recordImporter, IDataSourceReader reader) { var propValues = new Dictionary <string, object>(importingTask.Descriptor.ImportEntity.Fields.Count); foreach (var fieldMapping in importingTask.Descriptor.ImportEntity.Fields) { var propertyValueExpression = reader.GetField(fieldMapping.Selector).ToString(); var metaProperty = importingTask.Entity.Fields[fieldMapping.Field]; if (metaProperty.Type.TryParse(metaProperty, propertyValueExpression, out var propertyValue, fieldMapping.Format)) { propValues.Add(metaProperty.Name, propertyValue); }
public async Task <object> FindExistedRecordOrDefaultAsync(ImportingJob importingTask, IReadOnlyDictionary <string, object> symbols) { var entityWhere = importingTask.Descriptor.ImportEntity.Where; if (string.IsNullOrEmpty(entityWhere)) { return(null); } var pred = this.CreateEntityPredicateExpression(entityWhere, symbols); var repo = importingTask.Descriptor.IsSudo ? _repository.Sudo() : _repository; return(await _repository.FirstOrDefaultAsync(pred)); }
async Task DoImportAsync(ImportingJob importingTask, ImportingTaskContext context) { var dataSource = _dataSources.Single(x => x.Format == importingTask.Descriptor.DataSource.Format); var recordFinderType = typeof(GenericRecordFinder <>).MakeGenericType(importingTask.Entity.ClrType); var recordFinder = context.ServiceProvider.GetRequiredService(recordFinderType) as IRecordFinder; var recordImporterType = typeof(GenericRecordImporter <>).MakeGenericType(importingTask.Entity.ClrType); var recordImporter = context.ServiceProvider.GetRequiredService(recordImporterType) as IRecordImporter; using (var stream = importingTask.ImportFileInfo.CreateReadStream()) using (var reader = dataSource.Open(stream, importingTask.Descriptor.ImportEntity.Selector)) { await reader.Initialize(); while (await reader.ReadAsync()) { await ImportSingleRecordAsync(importingTask, context, recordFinder, recordImporter, reader); } } }
public async Task InsertOrUpdateEntityAsync(ImportingJob importingTask, object record, bool canUpdate) { var typedRecord = (TEntity)record; var repo = importingTask.Descriptor.IsSudo ? _repository.Sudo() : _repository; await repo.InsertOrUpdateAsync(typedRecord); }