DD.WellWorkover.Cloud/AsbCloudDb/Model/AsbCloudDbContext.cs

506 lines
27 KiB
C#
Raw Normal View History

2021-07-21 15:22:58 +05:00
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
2021-04-07 18:01:56 +05:00
using System.Threading;
using System.Threading.Tasks;
#nullable disable
namespace AsbCloudDb.Model
{
//Scaffold-DbContext "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Model -DataAnnotations
public partial class AsbCloudDbContext : DbContext, IAsbCloudDbContext
{
public virtual DbSet<Cluster> Clusters { get; set; }
public virtual DbSet<Company> Companies { get; set; }
public virtual DbSet<Deposit> Deposits { get; set; }
public virtual DbSet<FileCategory> FileCategories { get; set; }
public virtual DbSet<FileInfo> Files { get; set; }
public virtual DbSet<FileMark> FileMarks { get; set; }
public virtual DbSet<Measure> Measures { get; set; }
public virtual DbSet<MeasureCategory> MeasureCategories { get; set; }
public virtual DbSet<ReportProperty> ReportProperties { get; set; }
2021-07-27 14:43:30 +05:00
public virtual DbSet<Telemetry> Telemetries { get; set; }
public virtual DbSet<TelemetryDataSaub> TelemetryDataSaub { get; set; }
public virtual DbSet<TelemetryDataSpin> TelemetryDataSpin { get; set; }
public virtual DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
2021-08-10 15:53:11 +05:00
public virtual DbSet<TelemetryEvent> TelemetryEvents { get; set; }
public virtual DbSet<TelemetryMessage> TelemetryMessages { get; set; }
2021-07-27 14:43:30 +05:00
public virtual DbSet<TelemetryUser> TelemetryUsers { get; set; }
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<UserRole> UserRoles { get; set; }
public virtual DbSet<Well> Wells { get; set; }
2021-10-12 12:17:46 +05:00
public virtual DbSet<WellComposite> WellComposites { get; set; }
public virtual DbSet<WellOperation> WellOperations { get; set; }
public virtual DbSet<WellOperationCategory> WellOperationCategories { get; set; }
2021-08-13 12:33:05 +05:00
public virtual DbSet<WellSectionType> WellSectionTypes { get; set; }
2021-07-21 15:22:58 +05:00
public virtual DbSet<WellType> WellTypes { get; set; }
public virtual DbSet<DrillParams> DrillParams { get; set; }
public virtual DbSet<DrillFlowChart> DrillFlowChart { get; set; }
public virtual DbSet<RelationUserUserRole> RelationUserUserRoles { get; set; }
public virtual DbSet<Permission> Permissions { get; set; }
2021-07-28 09:46:58 +05:00
//var options = new DbContextOptionsBuilder<AsbCloudDbContext>()
// .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True")
// .Options;
//var context = new AsbCloudDbContext(options);
2021-09-07 14:04:30 +05:00
public AsbCloudDbContext() : base()
2021-09-10 11:28:57 +05:00
{
Database.Migrate();
}
2021-09-07 14:04:30 +05:00
public AsbCloudDbContext(DbContextOptions<AsbCloudDbContext> options)
: base(options)
{
//Database.SetCommandTimeout(60 * 60 * 2);
2021-09-10 11:28:57 +05:00
Database.Migrate();
}
2021-09-07 14:04:30 +05:00
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
2021-09-07 14:04:30 +05:00
if (!optionsBuilder.IsConfigured)
optionsBuilder.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("adminpack")
.HasAnnotation("Relational:Collation", "Russian_Russia.1251");
modelBuilder.Entity<Cluster>(entity =>
{
entity.HasOne(d => d.Deposit)
.WithMany(p => p.Clusters)
.HasForeignKey(d => d.IdDeposit)
.HasConstraintName("t_cluster_t_deposit_id_fk");
});
2021-10-12 10:39:42 +05:00
modelBuilder.Entity<WellComposite>(entity =>
{
entity.HasKey(
nameof(WellComposite.IdWell),
nameof(WellComposite.IdWellSrc),
nameof(WellComposite.IdWellSectionType));
entity.HasOne(d => d.Well)
.WithMany(p => p.WellComposites)
.HasForeignKey(d => d.IdWell)
.HasConstraintName("t_well_сomposite_t_well_id_fk");
entity.HasOne(d => d.WellSrc)
.WithMany(p => p.WellCompositeSrcs)
.HasForeignKey(d => d.IdWellSrc)
.HasConstraintName("t_well_сomposite_src_t_well_id_fk");
entity.HasOne(d => d.WellSectionType)
.WithMany(p => p.WellComposites)
.HasForeignKey(d => d.IdWellSectionType)
2021-10-12 10:39:42 +05:00
.HasConstraintName("t_well_сomposite_t_well_section_type_id_fk");
});
modelBuilder.Entity<TelemetryDataSaub>(entity =>
{
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.DataSaub)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk");
entity.HasKey(nameof(ITelemetryData.IdTelemetry), nameof(ITelemetryData.Date));
});
modelBuilder.Entity<TelemetryDataSpin>(entity =>
{
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.DataSpin)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk");
entity.HasKey(nameof(ITelemetryData.IdTelemetry), nameof(ITelemetryData.Date));
});
2021-08-10 15:53:11 +05:00
modelBuilder.Entity<TelemetryMessage>(entity =>
{
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.Messages)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_messages_t_telemetry_id_fk");
});
modelBuilder.Entity<TelemetryUser>(entity =>
{
2021-04-23 10:21:25 +05:00
entity.HasKey(nameof(TelemetryUser.IdTelemetry), nameof(TelemetryUser.IdUser));
entity.HasOne(d => d.Telemetry)
2021-04-23 10:21:25 +05:00
.WithMany(p => p.Users)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_telemetry_user_t_telemetry_id_fk");
});
modelBuilder.Entity<TelemetryAnalysis>(entity =>
{
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.Analysis)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_analysis_t_telemetry_id_fk");
entity.HasOne(d => d.Operation)
.WithMany(p => p.Analysis)
.HasForeignKey(d => d.IdOperation)
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("t_analysis_t_operation_id_fk");
});
2021-08-10 15:53:11 +05:00
modelBuilder.Entity<TelemetryEvent>(entity =>
2021-04-23 10:21:25 +05:00
{
2021-08-10 15:53:11 +05:00
entity.HasKey(nameof(TelemetryEvent.IdTelemetry), nameof(TelemetryEvent.IdEvent));
2021-04-23 10:21:25 +05:00
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.Events)
.HasForeignKey(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.Cascade)
2021-04-23 10:21:25 +05:00
.HasConstraintName("t_event_t_telemetry_id_fk");
});
modelBuilder.Entity<User>(entity =>
{
entity.HasOne(d => d.Company)
.WithMany(p => p.Users)
.HasForeignKey(d => d.IdCompany)
.OnDelete(DeleteBehavior.SetNull)
2021-07-21 15:22:58 +05:00
.HasConstraintName("t_user_t_company_id_fk");
entity.HasIndex(d => d.Login)
.IsUnique();
});
modelBuilder.Entity<Well>(entity =>
{
entity.HasOne(d => d.Cluster)
.WithMany(p => p.Wells)
.HasForeignKey(d => d.IdCluster)
.HasConstraintName("t_well_t_cluster_id_fk");
entity.HasOne(d => d.Telemetry)
.WithOne(p => p.Well)
.HasForeignKey<Well>(d => d.IdTelemetry)
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("t_well_t_telemetry_id_fk");
});
modelBuilder.Entity<RelationCompanyWell>(entity =>
{
2021-07-21 16:30:57 +05:00
entity.HasKey(nameof(RelationCompanyWell.IdCompany), nameof(RelationCompanyWell.IdWell));
entity.HasOne(r => r.Well)
.WithMany(w => w.RelationCompaniesWells)
.HasForeignKey(r => r.IdWell)
.HasConstraintName("t_relation_company_well_t_well_id_fk");
entity.HasOne(r => r.Company)
.WithMany(w => w.RelationCompaniesWells)
.HasForeignKey(r => r.IdCompany)
.HasConstraintName("t_relation_company_well_t_company_id_fk");
});
modelBuilder.Entity<WellOperation>(entity =>
2021-08-13 15:37:33 +05:00
{
entity.HasIndex(d => d.DepthEnd);
entity.HasIndex(d => d.DateStart);
2021-08-13 15:37:33 +05:00
});
modelBuilder.Entity<DrillParams>(entity =>
{
// entity.HasOne(d => d.Well)
// .WithOne(p => p.)
// .HasForeignKey<Well>(d => d.IdTelemetry)
// .OnDelete(DeleteBehavior.SetNull)
// .HasConstraintName("t_well_t_telemetry_id_fk");
entity.HasOne(r => r.WellSectionType)
.WithMany(w => w.DrillParamsCollection)
.HasForeignKey(r => r.IdWellSectionType)
.HasConstraintName("t_drill_params_t_well_section_type_id_fk");
});
modelBuilder.Entity<DrillFlowChart>(entity =>
{
entity.HasIndex(d => d.IdWellOperationCategory);
});
modelBuilder.Entity<FileMark>(entity =>
{
entity.HasOne(d => d.User)
.WithMany(p => p.FileMarks)
.HasForeignKey(d => d.IdUser)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_user_t_file_mark_fk");
entity.HasOne(d => d.FileInfo)
.WithMany(p => p.FileMarks)
.HasForeignKey(d => d.IdFile)
.OnDelete(DeleteBehavior.Cascade)
.HasConstraintName("t_file_mark_t_file_info_fk");
});
FillData(modelBuilder);
}
2021-05-19 15:21:19 +05:00
private static void FillData(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserRole>(entity =>
{
entity.HasData(new List<UserRole>{
new UserRole{ Id = 1, Caption = "Администратор", },
new UserRole{ Id = 2, Caption = "Пользователь", },
});
});
modelBuilder.Entity<User>(entity =>
{
entity.HasData(new List<User>{
new User{
Id = 1,
IdCompany = 1,
Login = "dev",
PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", // dev
Name = "Разработчик",
},
});
});
modelBuilder.Entity<RelationUserUserRole>(entity =>
{
entity.HasData(new List<RelationUserUserRole>{
new RelationUserUserRole{ Id = 1, IdUser = 1, IdUserRole = 2 }
});
});
modelBuilder.Entity<Company>(entity =>
{
entity.HasData(new List<Company>{
new Company{ Id = 1, Caption = "ООО \"АСБ\"", IdCompanyType = 3},
});
});
modelBuilder.Entity<WellOperationCategory>(entity =>
{
entity.HasData(new List<WellOperationCategory> {
// Автоматически опеределяемые операции
new WellOperationCategory {Id = 1, Name = "Невозможно определить операцию", Code = 0},
new WellOperationCategory {Id = 2, Name = "Роторное бурение", Code = 0 },
new WellOperationCategory {Id = 3, Name = "Слайдирование", Code = 0 },
new WellOperationCategory {Id = 4, Name = "Подъем с проработкой", Code = 0 },
new WellOperationCategory {Id = 5, Name = "Спуск с проработкой", Code = 0 },
new WellOperationCategory {Id = 6, Name = "Подъем с промывкой", Code = 0 },
new WellOperationCategory {Id = 7, Name = "Спуск с промывкой", Code = 0 },
new WellOperationCategory {Id = 8, Name = "Спуск в скважину", Code = 0 },
new WellOperationCategory {Id = 9, Name = "Спуск с вращением", Code = 0 },
new WellOperationCategory {Id = 10, Name = "Подъем из скважины", Code = 0 },
new WellOperationCategory {Id = 11, Name = "Подъем с вращением", Code = 0 },
new WellOperationCategory {Id = 12, Name = "Промывка в покое", Code = 0 },
new WellOperationCategory {Id = 13, Name = "Промывка с вращением", Code = 0 },
new WellOperationCategory {Id = 14, Name = "Удержание в клиньях", Code = 0 },
new WellOperationCategory {Id = 15, Name = "Неподвижное состояние", Code = 0 },
new WellOperationCategory {Id = 16, Name = "Вращение без циркуляции", Code = 0 },
new WellOperationCategory {Id = 17, Name = "На поверхности", Code = 0 },
// Операции ручного ввода
new WellOperationCategory {Id = 1001, Name = "Бурение", Code = 0 },
new WellOperationCategory {Id = 1002, Name = "ГИС", Code = 0 },
new WellOperationCategory {Id = 1003, Name = "ГФР", Code = 0 },
new WellOperationCategory {Id = 1004, Name = "Монтаж ПВО", Code = 0 },
new WellOperationCategory {Id = 1005, Name = "Демонтаж ПВО", Code = 0 },
new WellOperationCategory {Id = 1006, Name = "Установка ФА", Code = 0 },
new WellOperationCategory {Id = 1007, Name = "Оборудование устья", Code = 0 },
new WellOperationCategory {Id = 1008, Name = "ОЗЦ", Code = 0 },
new WellOperationCategory {Id = 1009, Name = "Оборудование устья", Code = 0 },
new WellOperationCategory {Id = 1010, Name = "ОЗЦ", Code = 0 },
new WellOperationCategory {Id = 1011, Name = "Начало цикла строительства скважины", Code = 0 },
new WellOperationCategory {Id = 1012, Name = "Окончание цикла строительства скважины", Code = 0 },
new WellOperationCategory {Id = 1013, Name = "Опрессовка ПВО", Code = 0 },
new WellOperationCategory {Id = 1014, Name = "Опресовка Ц.К.", Code = 0 },
new WellOperationCategory {Id = 1015, Name = "Опрессовка ВЗД", Code = 0 },
new WellOperationCategory {Id = 1016, Name = "Перевод скв на другой тип промывочной жидкости", Code = 0 },
new WellOperationCategory {Id = 1017, Name = "Перезапись каротажа", Code = 0 },
new WellOperationCategory {Id = 1018, Name = "Перетяжка талевого каната", Code = 0 },
2021-10-06 18:06:07 +05:00
new WellOperationCategory {Id = 1019, Name = "Наращивание, промывка", Code = 0 },
new WellOperationCategory {Id = 1020, Name = "Подъем инструмента", Code = 0 },
new WellOperationCategory {Id = 1021, Name = "Подъем инструмента с промывкой", Code = 0 },
new WellOperationCategory {Id = 1022, Name = "Обратная проработка", Code = 0 },
new WellOperationCategory {Id = 1023, Name = "Сборка инструмента", Code = 0 },
new WellOperationCategory {Id = 1024, Name = "Подготовительные работы", Code = 0 },
new WellOperationCategory {Id = 1025, Name = "Сборка КНБК", Code = 0 },
new WellOperationCategory {Id = 1026, Name = "Разборка КНБК", Code = 0 },
new WellOperationCategory {Id = 1027, Name = "Промывка", Code = 0 },
new WellOperationCategory {Id = 1028, Name = "Промежуточная промывка", Code = 0 },
new WellOperationCategory {Id = 1029, Name = "Прокачка пачек", Code = 0 },
new WellOperationCategory {Id = 1030, Name = "Разбуривание тех.оснастки", Code = 0 },
new WellOperationCategory {Id = 1031, Name = "Ремонт", Code = 0 },
new WellOperationCategory {Id = 1032, Name = "Спуск инструмента", Code = 0 },
new WellOperationCategory {Id = 1033, Name = "Спуск инструмента с промывкой", Code = 0 },
new WellOperationCategory {Id = 1034, Name = "Прямая проработка", Code = 0 },
new WellOperationCategory {Id = 1035, Name = "Принудительная проработка", Code = 0 },
new WellOperationCategory {Id = 1036, Name = "Спуск обсадной колонны", Code = 0 },
new WellOperationCategory {Id = 1037, Name = "Тех СПО-подъем", Code = 0 },
new WellOperationCategory {Id = 1038, Name = "Тех СПО-спуск", Code = 0 },
new WellOperationCategory {Id = 1039, Name = "Техническое обслуживание", Code = 0 },
new WellOperationCategory {Id = 1040, Name = "Цементаж", Code = 0 },
new WellOperationCategory {Id = 1041, Name = "Шаблонировка ствола", Code = 0 },
new WellOperationCategory {Id = 1042, Name = "Геологическое осложнение", Code = 0 },
new WellOperationCategory {Id = 1043, Name = "НПВ", Code = 0 },
new WellOperationCategory {Id = 1044, Name = "ВМР", Code = 0 },
new WellOperationCategory {Id = 1045, Name = "Прочее", Code = 0 },
new WellOperationCategory {Id = 1046, Name = "Спуск КНБК", Code = 0 },
new WellOperationCategory {Id = 1047, Name = "Подъем КНБК", Code = 0 },
new WellOperationCategory {Id = 1048, Name = "Спуск ОК", Code = 0 },
new WellOperationCategory {Id = 1050, Name = "Промывка при спуске ОК", Code = 0 }
});
});
modelBuilder.Entity<FileCategory>(entity =>
{
entity.HasData(new List<FileCategory> {
new FileCategory {Id = 1, Name = "Растворный сервис", ShortName = "fluidService"},
new FileCategory {Id = 2, Name = "Цементирование", ShortName = "cement"},
new FileCategory {Id = 3, Name = "ННБ", ShortName = "nnb"},
new FileCategory {Id = 4, Name = "ГТИ", ShortName = "gti"},
new FileCategory {Id = 5, Name = "Документы по скважине", ShortName = "wellDocuments"},
new FileCategory {Id = 6, Name = "Супервайзер", ShortName = "supervisor"},
new FileCategory {Id = 7, Name = "Мастер", ShortName = "master"},
new FileCategory {Id = 8, Name = "Последний замер бурового раствора ПЛАН", ShortName = "fluidPlanLastData"},
new FileCategory {Id = 9, Name = "Последний замер бурового раствора ФАКТ", ShortName = "fluidFactLastData"},
new FileCategory {Id = 10, Name = "Последние данные Шламограммы", ShortName = "mudLastData"},
new FileCategory {Id = 11, Name = "Последние данные ННБ", ShortName = "nnbLastData"},
2021-08-29 17:25:16 +05:00
new FileCategory {Id = 12, Name = "Рапорт", ShortName = "report"},
2021-08-31 09:52:32 +05:00
new FileCategory {Id = 13, Name = "Программа бурения, части", ShortName = "ПБч"},
new FileCategory {Id = 14, Name = "Программа бурения", ShortName = "ПБ"},
});
});
2021-08-10 15:48:06 +05:00
2021-09-10 11:28:57 +05:00
modelBuilder.Entity<WellSectionType>(entity =>
{
2021-08-10 15:48:06 +05:00
entity.HasData(new List<WellSectionType>{
2021-08-25 15:17:24 +05:00
new WellSectionType{ Id = 1, Caption = "Пилотный ствол"},
new WellSectionType{ Id = 2, Caption = "Направление"},
new WellSectionType{ Id = 3, Caption = "Кондуктор"},
new WellSectionType{ Id = 4, Caption = "Эксплуатационная колонна"},
new WellSectionType{ Id = 5, Caption = "Транспортный ствол"},
new WellSectionType{ Id = 6, Caption = "Хвостовик"},
2021-08-10 15:48:06 +05:00
});
});
2021-08-25 17:58:35 +05:00
2021-09-10 11:28:57 +05:00
modelBuilder.Entity<WellType>(entity =>
{
entity.HasData(new List<WellType> {
2021-08-25 17:58:35 +05:00
new WellType{ Id = 1, Caption = "Наклонно-направленная"},
new WellType{ Id = 2, Caption = "Горизонтальная"},
});
});
2021-09-10 11:28:57 +05:00
modelBuilder.Entity<MeasureCategory>(entity =>
{
entity.HasData(new List<MeasureCategory> {
new MeasureCategory{ Id = 1, Name = "Показатели бурового раствора", ShortName = "Раствор"},
new MeasureCategory{ Id = 2, Name = "Шламограмма", ShortName = "Шламограмма"},
new MeasureCategory{ Id = 3, Name = "ННБ", ShortName = "ННБ"},
});
});
modelBuilder.Entity<CompanyType>(entity =>
{
entity.HasData(new List<CompanyType>{
new CompanyType{ Id = 1, Caption = "Недрапользователь", },
new CompanyType{ Id = 2, Caption = "Буровой подрядчик", },
new CompanyType{ Id = 3, Caption = "Сервис автоматизации бурения", },
});
});
//modelBuilder.Entity<ModeType>(entity =>
//{
// entity.HasData(new List<ModeType>{
// new ModeType{ Id = 1, Caption = "Нагрузка" },
// new ModeType{ Id = 2, Caption = "Дифф. давление" },
// new ModeType{ Id = 3, Caption = "Момент на ВСП" },
// new ModeType{ Id = 4, Caption = "Обороты на ВСП" },
// new ModeType{ Id = 5, Caption = "Расход" }
// });
//});
}
public IQueryable<Well> GetWellsForCompany(int idCompany)
{
return from well in Wells
2021-07-21 16:30:57 +05:00
.Include(w => w.RelationCompaniesWells)
.ThenInclude(r => r.Company)
.Include(w => w.Cluster)
.ThenInclude(c => c.Deposit)
2021-07-21 16:30:57 +05:00
where well.RelationCompaniesWells.Any(c => c.IdCompany == idCompany)
select well;
}
public IQueryable<User> GetUsersByLogin(string login)
=> Users
.Include(e => e.RelationUsersUserRoles)
.ThenInclude(r => r.UserRole)
.Include(e => e.Company)
.Where(e => e.Login == login);
2021-04-07 18:01:56 +05:00
public async Task<(DateTime From, DateTime To)> GetDatesRangeAsync<TEntity>(int idTelemetry,
CancellationToken token = default)
where TEntity : class, ITelemetryData
{
var dbSet = Set<TEntity>();
var datesRange = await (from m in dbSet
where m.IdTelemetry == idTelemetry
group m by m.IdTelemetry into g
select new
{
From = g.Min(d => d.Date),
To = g.Max(d => d.Date)
}).AsNoTracking().FirstOrDefaultAsync(token);
if (datesRange is null)
2021-05-19 15:21:19 +05:00
return (DateTime.MinValue, DateTime.MaxValue);
2021-05-19 15:21:19 +05:00
return (datesRange.From, datesRange.To);
}
public async Task<IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>> GetDepthToIntervalAsync(int telemetryId,
int intervalHoursTimestamp, int workStartTimestamp, double timezoneOffset, CancellationToken token)
{
//TODO: Сменить на LINQ группирование
using var command = Database.GetDbConnection().CreateCommand();
command.CommandText = $@"SELECT Min(t.bit_depth) AS MinDepth, Max(t.bit_depth) AS MaxDepth, Min(t.Date) AS dateStart
FROM t_telemetry_data_saub AS t
WHERE id_telemetry = {telemetryId} AND t.Id % 10 = 0
GROUP BY floor((extract(epoch from t.date) - {workStartTimestamp} + {timezoneOffset}) / {intervalHoursTimestamp});";
Database.OpenConnection();
using var reader = await command.ExecuteReaderAsync(token);
var result = new List<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>();
if (reader.HasRows)
{
while (reader.Read())
{
result.Add(
(
(double?)reader.GetValue(0),
(double?)reader.GetValue(1),
(DateTime)reader.GetValue(2)
));
}
}
return result;
}
}
}