我经历了几个答案,很少有人能够找到我已有的解决方案。
在我的作业调度应用程序中,我想检查新添加的任务是否与数据库中已有的任务重叠。下面的解决方案为我提供了基本场景的结果,但对于少数人来说并不是很有效。就像新任务的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这样的库是否适合小型项目。
干杯
答案 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”,这是来自之前的调试会话,并且断点从未被清除。
所以我的问题的答案是。休息然后测试。