【问题标题】:Check if new starttime and endtime overlaps with starttime and endtime records in db using linq使用 linq 检查新的开始时间和结束时间是否与 db 中的开始时间和结束时间记录重叠
【发布时间】:2017-11-16 20:33:04
【问题描述】:

我得到的答案很少,很少能与我已有的解决方案相匹配。

在我的作业调度应用程序中,我想检查新添加的任务是否与数据库中已经存在的任务重叠。下面的解决方案为我提供了基本场景的结果,但对少数人不太适用。就像新任务的结束时间与另一个任务的开始时间一样。

例如:

//this returns false as it should - no overlaps
New Task      : 14:00 - 15:00
Existing Task : 16:00 - 17:00

//this returns true, as existing taskstart is < new takend - 17:00 overlap
New Task      : 14:00 - 17:00
Existing Task : 16:00 - 17:00

//this scenario should return false
/*udpated*/the tasks do not overlap here but touch each other
New Task      : 14:00 - 16:00
Existing Task : 16:00 - 17:00

private bool CheckForOtherTasks(int UserId, DateTime _dtTaskStart, DateTime _dtTaskEnd)
{
    bool _bTasksExist = false;
    using (var _dbContext = new task_Entities())
    {
        _bTasksExist = (from t in _dbContext.Tasks
                        where t.UserId == UserId
                        where t.dtTaskStart < _dtTaskEnd && _dtTaskStart < t.dtTaskEnd
                        select t).Any();
    }

    return _bTasksExist;
}

在新的结束时间 == 现有的开始时间之前,上述解决方案可以正常工作,反之亦然。

这个解决方案似乎可以解决它,但我不确定如何在不遍历所有记录的情况下与 LINQ 一起实现它。 How check intersection of DateTime periods

将 LINQ 用于此任务是一个好方法还是使用存储过程返回结果是一个更好的选择?

另外,像https://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET 这样的库是否适合小型项目。

干杯

【问题讨论】:

  • 你试过... where t.dtTaskStart &lt;= _dtTaskEnd &amp;&amp; _dtTaskStart &lt;= t.dtTaskEnd ...吗?
  • 好吧,那会让我返回结果为真,这意味着它是重叠的。我想我应该改写我的问题。我希望该方法在 16:00 == 16:00 或 16:00 的条件下返回 false
  • //this scenario should return false 你的代码不是已经这样做了吗?
  • 显然不是,因此我发布了这个问题。现在我再次调试它返回 false。
  • 如果您已解决问题,请不要更改标题。 Mark the answer that helped you to mark it as resolved. 如果没有答案提供解决方案,请添加您自己的答案。

标签: c# linq


【解决方案1】:

在新的结束时间 == 现有的开始时间之前,上述解决方案可以正常工作,反之亦然。

然后只需将条件从&lt; 更改为&lt;= 并从&gt; 更改为&gt;=

    _bTasksExist = (from t in _dbContext.Tasks
                    where t.UserId == UserId
                    where t.dtTaskStart <= _dtTaskEnd && _dtTaskStart <= t.dtTaskEnd
                    select t).Any();

【讨论】:

  • 我实际上想返回 false 去了 16:00 == 16:00,因为当这种情况发生时,时间不会重叠,而是相互接触。我应该能够添加一个彼此相邻的任务。说 15:00 - 16:00 , 16:00 - 17:00
  • 所以你的初始条件似乎是正确的。您的原始代码在这样的时间返回 true 吗?
  • 它返回了 true,因此它难住了我,但现在我再次调试它,它似乎工作正常。
【解决方案2】:

在上面的测试场景中,最初返回的值为“True”。发布问题后,我休息了一下,然后重新开始,它给了我预期的结果。

现在是新西兰的凌晨 1:30,在编写更多代码之前我需要先睡一会儿。返回“False”的测试的结束时间“17:00”来自上一个调试会话,并且断点从未被清除。

所以我的问题的答案是。休息,然后测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2013-01-11
    相关资源
    最近更新 更多