LINQ Найти непересекающиеся записи аудита по дате - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть таблица аудита, в которой хранятся строки аудита для длительного процесса на уровне отдельной задачи в SQL Server.

  • auditId int,
  • TaskName nvarchar (255),
  • StartTime datetime,
  • EndTime (datetime, null),
  • Status (nvarchar (255), null)

Процесс содержит родительский элементи дочерние шаги, и каждый шаг записывается в таблицу аудита.Задача может иметь или не иметь родительский элемент.

например,

auditId, TaskName, StartTime, EndTime, Status

  1. Parent1, 09: 30:00, 09:40:00, Действительный
  2. Child1, 09:30:01, 09:35:00, Действительный
  3. Child2, 09:35:01, 09:40: 00, Действительный
  4. Parent2, 09:40:01, null, null
  5. Child3, 09:40:02, null, null

Использование C # 4.0/ LINQ to Entities / LINQ через ObservableCollection Я хотел бы получить сводку аудита из этой таблицы за последние X дней, содержащую общую продолжительность каждого дня по статусу.Я могу поворачивать отдельные записи для генерации сводки, если я могу выяснить, как получить сводные записи аудита.

В сводке аудита должны быть:

  1. Не должно быть никакого дублирующего аудитав противном случае записи удваивают длительность.
  2. Необходимо учитывать тот факт, что могут быть задачи, которые все еще выполняются на текущую дату, и возвращать нулевое значение
  3. Необходимо обрабатывать задержку между окончаниямипредыдущего задания и начало следующего задания.Вероятно, получая продолжительность между началом текущей задачи и началом следующей задачи вместо конца текущей задачи.
  4. Обработка нуля для последней задачи дня, которая не будет иметь следующего времени начала, если я использую время начала следующей записи, как описано в пункте 3

Такиспользуя приведенный выше пример, итоговые записи будут:

auditId, TaskName, StartTime, EndTime, Status

  1. Parent1, 09:30:00, 09: 40: 01, Действительный
  2. Parent2, 09:40:01, null, null

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 17 сентября 2010

Нашел довольно много "интересных" вещей об EF и датах, выясняя, как это сделать.

Итак, в конце концов, я:

  1. Расширена таблица журнала аудита, чтобы добавить новый обнуляемый DateTime StartDateTimeOfNext и приватный _startDateTimeOfNext для кэширования предыдущего значения. После расчета я не хочу рассчитывать снова
  2. Добавлен контекст сущности к тому же частичному классу
  3. Расширен класс таблицы аудита для добавления кода ниже.
  4. Я использовал DateTime.Today для DefaultIfEmpty, поскольку SQL Server 2005 не поддерживает C # DateTime.MinValue и DateTime.MaxValue
  5. Не очень красиво, но работает
  public DateTime? StartDateTimeOfNext
{  
    get  
    {  
        if (_startDateTimeOfNext == null)  
        {  
            DateTime windowMin = this.StartTime.Date;
            DateTime windowMax = this.StartTime.Date.AddDays(1).AddMinutes(-1);
            DateTime? query = (from nextAuditLog in AuditLog.AuditLogEntityContext.AuditLogs
            where nextAuditLog.auditId > this.auditId 
            && nextAuditLog.StartTime > this.StartTime 
            && nextAuditLog.StartTime <= windowMax 
            && nextAuditLog.StartTime >= windowMin
            orderby nextAuditLog.auditId ascending
            select nextAuditLog.StartTime
            ).DefaultIfEmpty(DateTime.Today).First();               
            if (query != DateTime.Today)
            {
                _startDateTimeOfNext = query;
                return query;
            }
            else
            {
                _startDateTimeOfNext = this.EndTime;
                return this.EndTime;
            }
        }
        else
        {
        return _startDateTimeOfNext;
        }
    }
}
...