diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs index c362611a..1e5a8403 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs @@ -3,12 +3,14 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudDb.Model.ProcessMaps; using Microsoft.EntityFrameworkCore; +using Org.BouncyCastle.Asn1.Ocsp; namespace AsbCloudInfrastructure.Repository; @@ -20,54 +22,69 @@ public class ProcessMapPlanRepository : CrudWellRelatedRepository private readonly IWellService wellService; public ProcessMapPlanRepository(IAsbCloudDbContext context, IWellService wellService) - : base(context, dbSet => - dbSet - .Include(p => p.WellSectionType) - .Include(p => p.Well)) + : base(context, dbSet => + dbSet + .Include(p => p.WellSectionType) + .Include(p => p.Well)) { - this.wellService = wellService; + this.wellService = wellService; } public async Task> GetAsync(IEnumerable requests, CancellationToken cancellationToken) { - var query = BuildQuery(requests); + var query = BuildQuery(requests); - var entities = await query.ToArrayAsync(cancellationToken); + var entities = await query.ToArrayAsync(cancellationToken); - return entities.Select(Convert); + return entities.Select(Convert); } public Task RemoveByWellAsync(int idWell) { - var query = GetQuery().Where(x => x.IdWell == idWell); + var query = GetQuery().Where(x => x.IdWell == idWell); - dbSet.RemoveRange(query); + dbSet.RemoveRange(query); - return dbContext.SaveChangesAsync(CancellationToken.None); + return dbContext.SaveChangesAsync(CancellationToken.None); } private IQueryable BuildQuery(IEnumerable requests) { - var query = GetQuery(); + var queries = requests + .Select(request => BuildQuery(request)) + .ToArray(); + + var query = queries.FirstOrDefault() + ?? throw new ArgumentInvalidException(nameof(requests), "Пустые запросы недопустимы"); - foreach (var request in requests) - { - query = query.Where(p => p.IdWell == request.IdWell); + for ( var i = 1; i < queries.Length; i++) + query = query.Union(queries[i]); - if (request.IdWellSectionType is not null) - query = query.Where(p => p.IdWellSectionType == request.IdWellSectionType); + query = query + .Distinct() + .OrderBy(e => e.DepthStart) + .ThenBy(e => e.Id) + .AsNoTracking(); - if (request.UpdateFrom is not null) - { - var timezone = wellService.GetTimezone(request.IdWell); - var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + return query; + } - query = query.Where(p => p.LastUpdate >= updateFromUtc); - } - } + private IQueryable BuildQuery(ProcessMapPlanRequest request) + { + var query = GetQuery(); + + query = query.Where(p => p.IdWell == request.IdWell); - return query.OrderBy(e => e.DepthStart) - .ThenBy(e => e.Id) - .AsNoTracking(); + if (request.IdWellSectionType is not null) + query = query.Where(p => p.IdWellSectionType == request.IdWellSectionType); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + + query = query.Where(p => p.LastUpdate >= updateFromUtc); + } + return query; } } \ No newline at end of file