исключить время из другой таблицы в Entity Framework - PullRequest
1 голос
/ 29 мая 2019

У меня есть две таблицы: Outages и PlannedMaintance. Я должен получить записи об отключениях, которые находятся под определенным диапазоном дат, и, если это время относится к PlannedMaintance, пропустить эти записи. например если между 1 may 2019 12:00 AM до 09 May 2019 11:59 PM имеется 10 записей, а для плановых таблиц времени записи для параметра StartDownTime установлено значение 3 May 2019 10:35 AM, а для параметра EndDownTime - 3 may 2019 11:00 AM. в течение этого периода есть 3 записи о сбоях, мы должны пропустить их, и в списке вывода должно быть 7 записей.

Я не хочу зацикливаться на записях. Будут записи сотен тысяч, это может заглушить сайт.

Вот структура таблицы:

перелив

Outage table

PlannedDownTime

PlannedDownTime Table

Запрос Entity Framework:

  var netwrokErrorsQuery = db.Outages.Where(_ => _.OutageType == "Network" && _.OutageStart >= startDate && _.OutageEnd <= endDate).ToList().Where(_=>_.OutageStart.Hour<2 && _.OutageStart.Hour > 5 || _.OutageEnd.Value.Hour < 2 && _.OutageEnd.Value.Hour > 5).ToList();
        var softwareErrorsQuery = db.Outages.Where(_ => _.OutageType == "Software" && _.OutageStart >= startDate && _.OutageEnd <= endDate).ToList().Where(_ => _.OutageStart.Hour < 2 && _.OutageStart.Hour > 5 || _.OutageEnd.Value.Hour < 2 && _.OutageEnd.Value.Hour > 5).ToList();
        var hardwareErrorsQuery = db.Outages.Where(_ => _.OutageType == "Hardware" && _.OutageStart >= startDate && _.OutageEnd <= endDate).ToList().Where(_ => _.OutageStart.Hour < 2 && _.OutageStart.Hour > 5 || _.OutageEnd.Value.Hour < 2 && _.OutageEnd.Value.Hour > 5).ToList();

Я не могу понять, как я могу это сделать

1 Ответ

0 голосов
/ 29 мая 2019

Пожалуйста, попробуйте это

var records = db.Outages
           .Join(db.PlannedDownTime,
                 o => o.ReaderId,
                 p => p.ReaderId,
                 (o, p) => new {
                     OutageStart = o.OutageStart,
                     OutageEnd = o.OutageEnd,
                     DowntimeStart = p.DowntimeStart,
                     DowntimeEnd = p.DowntimeEnd
                 }
                 ).Where(r=>r.OutageStart >= START_TIME)
                 .Where(r=>r.OutageEnd <= END_TIME)
                 .Where(r=>(r.DowntimeStart < START_TIME && r.DowntimeEnd < START_TIME ) || (r.DowntimeStart > END_TIME && r.DowntimeEnd > END_TIME ))
                 .ToList();
...