【问题标题】:LINQ Find non overlapping audit records by dateLINQ 按日期查找不重叠的审计记录
【发布时间】:2010-09-10 09:20:35
【问题描述】:

我有一个审计表,它存储 SQL Server 中单个任务级别的长时间运行进程的审计行。

  • auditId int,
  • 任务名称 nvarchar(255),
  • StartTime 日期时间,
  • 结束时间(日期时间,空),
  • 状态(nvarchar(255),空)

流程包含父步骤和子步骤,每个步骤都记录到审计表中。任务可能有也可能没有有父级。

例如

auditId、TaskName、StartTime、EndTime、状态

  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

在 ObservableCollection 上使用 C# 4.0 / LINQ to Entities / LINQ 我想从此表中获取过去 X 天的审核摘要,其中包含按状态分类的每一天的总持续时间。如果我能弄清楚如何获取摘要审计记录,我可以将单个记录转为生成摘要。

在审核摘要中应:

  1. 不得有任何重叠的审计记录,否则将重复计算持续时间。
  2. 需要处理可能有任务在当前日期仍在运行并返回 null 的事实
  3. 需要处理上一个任务结束和下一个任务开始之间的延迟。可能是通过获取当前任务开始和下一个任务开始之间的持续时间,而不是当前任务结束之间的持续时间。
  4. 如果我使用第 3 点中所述的下一条记录的开始时间,则为当天的最后一项任务处理空值,该任务将没有以下开始时间

因此,使用上面的示例,摘要记录将是:

auditId、TaskName、StartTime、EndTime、状态

  1. Parent1,09:30:00,09:40:01,有效
  2. Parent2,09:40:01,null,null

有什么想法吗?

谢谢

【问题讨论】:

    标签: linq linq-to-entities c#-4.0 linq-to-objects


    【解决方案1】:

    在弄清楚如何做到这一点时,发现了很多关于 EF 和日期的“有趣”的东西。

    所以最后我:

    1. 扩展了审计日志表以添加一个新的可为空的 DateTime StartDateTimeOfNext 和私有 _startDateTimeOfNext 以缓存以前的值。计算完就不想再计算了
    2. 为同一个部分类添加了实体上下文
    3. 扩展了 Audit 表类以添加以下代码。
    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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-09-19
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多