使用linq检查新的starttime和endtime是否与db中的starttime和endtime记录重叠

时间:2017-11-16 11:39:23

标签: c# linq

我经历了几个答案,很少有人能够找到我已有的解决方案。

在我的作业调度应用程序中,我想检查新添加的任务是否与数据库中已有的任务重叠。下面的解决方案为我提供了基本场景的结果,但对于少数人来说并不是很有效。就像新任务的endtime与另一个任务的starttime相同的情况一样。

e.g:

//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;
}

以上解决方案正常工作,直到新的endtime ==现有的starttime,反之亦然。

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

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

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

干杯

2 个答案:

答案 0 :(得分:0)

  

以上解决方案正常工作,直到新的endtime ==现有的starttime,反之亦然。

然后只需将条件从<更改为<=,从>更改为>=

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

答案 1 :(得分:0)

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

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

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