【发布时间】: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 <= _dtTaskEnd && _dtTaskStart <= 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. 如果没有答案提供解决方案,请添加您自己的答案。