diff --git a/AsbCloudDb/EFExtentions.cs b/AsbCloudDb/EFExtentions.cs index 3cbf3509..a00f2899 100644 --- a/AsbCloudDb/EFExtentions.cs +++ b/AsbCloudDb/EFExtentions.cs @@ -69,6 +69,14 @@ namespace AsbCloudDb return database.ExecuteSqlRawAsync(query, token); } + public static Task ExecInsertOrIgnoreAsync(this Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade database, DbSet dbSet, IEnumerable items, CancellationToken token) + where T : class + { + var factory = GetQueryStringFactory(dbSet); + var query = factory.MakeInsertOrIgnoreSql(items); + return database.ExecuteSqlRawAsync(query, token); + } + public static Task ExecInsertAsync(this Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade database, DbSet dbSet, IEnumerable items, CancellationToken token) where T : class { @@ -162,6 +170,14 @@ namespace AsbCloudDb conflictBody = $" ON CONFLICT {pk} DO UPDATE SET {excludedUpdateSet};"; } + public string MakeInsertOrIgnoreSql(IEnumerable items) + { + var builder = new StringBuilder(insertHeader, 7); + BuildRows(builder, items); + builder.Append(" ON CONFLICT DO NOTHING;"); + return builder.ToString(); + } + public string MakeInsertOrUpdateSql(IEnumerable items) { var builder = new StringBuilder(insertHeader, 7); diff --git a/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs b/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs index 0c750c6b..cc53d92e 100644 --- a/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs +++ b/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs @@ -12,9 +12,10 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { public class WitsRecordRepository : IWitsRecordRepository - where TEntity : class, ITelemetryData + where TEntity : AsbCloudDb.Model.WITS.RecordBase, ITelemetryData where TDto : AsbCloudApp.Data.ITelemetryData { + private static Random random = new Random((int)(DateTime.Now.Ticks % 0xFFFFFFFF)); private readonly DbSet dbset; private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; @@ -78,31 +79,62 @@ namespace AsbCloudInfrastructure.Repository var dateMin = entities.Min(e => e.DateTime); var dateMax = entities.Max(e => e.DateTime); - var existingEntities = await dbset + var existingEntities = await db.Set() .Where(e => e.IdTelemetry == idTelemetry) .Where(e => e.DateTime >= dateMin && e.DateTime <= dateMax) - .Select(e => new { e.DateTime, e.IdTelemetry}) + .Select(e => e.DateTime) + .OrderBy(d => d) .ToArrayAsync(token); - + foreach (var entity in entities) { - if (existingEntities.Any(e=>e.IdTelemetry == entity.IdTelemetry && e.DateTime == entity.DateTime)) - dbset.Update(entity); - else + if (!existingEntities.Any(e => e.DateTime == entity.DateTime)) + { dbset.Add(entity); + } + else + { + var dt = entity.DateTime; + entity.DateTime = new DateTimeOffset( + dt.Year, + dt.Month, + dt.Day, + dt.Hour, + dt.Minute, + dt.Second, + (dt.Millisecond + random.Next(1, 283)) % 1000, + dt.Offset); + dbset.Add(entity); + } } await db.SaveChangesAsync(token); } + private static short GetRecId(TDto dto) + { + var recid = dto switch + { + AsbCloudApp.Data.WITS.Record1Dto _ => 1, + AsbCloudApp.Data.WITS.Record7Dto _ => 7, + AsbCloudApp.Data.WITS.Record8Dto _ => 8, + AsbCloudApp.Data.WITS.Record50Dto _ => 50, + AsbCloudApp.Data.WITS.Record60Dto _ => 60, + AsbCloudApp.Data.WITS.Record61Dto _ => 61, + _ => 0, + }; + return (short)recid; + } + private static TEntity Convert(TDto dto, int idTelemetry, double timezoneHours) { if (dto is null) return null; var entity = dto.Adapt(); - entity.IdTelemetry = idTelemetry; - entity.DateTime = dto.DateTime.ToUtcDateTimeOffset(timezoneHours); + entity.Recid = GetRecId(dto); + entity.IdTelemetry = idTelemetry; + entity.DateTime = dto.DateTime.ToUtcDateTimeOffset(timezoneHours); return entity; }