using AsbCloudApp.Data.Trajectory; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { public class TrajectoryNnbRepository : ITrajectoryNnbRepository { private readonly IAsbCloudDbContext db; public TrajectoryNnbRepository(IAsbCloudDbContext db) { this.db = db; } private IQueryable BuildQuery(TrajectoryRequest request) { var well = db.Wells.SingleOrDefault(w => w.Id == request.IdWell); if (well is null) throw new ArgumentInvalidException($"Скважина с Id: {request.IdWell} не найдена", nameof(request.IdWell)); var query = db.Record7.Where(r => r.IdTelemetry == well.IdTelemetry) .Where(x => x.IdTelemetry == well.IdTelemetry); if (request.GeDate.HasValue) query = query.Where(r => r.DateTime >= request.GeDate.Value); if (request.LeDate.HasValue) query = query.Where(r => r.DateTime <= request.LeDate.Value); return query.OrderBy(e => e.Deptsvym); } public async Task> GetAsync(int idWell, CancellationToken token) { var request = new TrajectoryRequest() { IdWell = idWell, }; var result = await GetByRequestAsync(request, token); return result; } public async Task> GetByRequestAsync(TrajectoryRequest request, CancellationToken token) { var entities = (await BuildQuery(request) .Where(coord => coord.Deptsvym.HasValue && coord.Svyinc.HasValue && coord.Svyazc.HasValue) .AsNoTracking() .ToArrayAsync(token)); var result = entities .Select(coord => new TrajectoryGeoFactDto { IdWell = request.IdWell, AzimuthMagnetic = coord.Svymtf, VerticalDepth = coord.Deptsvyv, WellboreDepth = coord.Deptsvym!.Value, ZenithAngle = coord.Svyinc!.Value, AzimuthGeo = coord.Svyazc!.Value }) .ToArray(); return result; } } }