我有一张如下表
SL Classroom Weekday StartTime EndTime
-- --------- ------- --------- --------
1 ADMN-100 Friday 01:00:00 02:00:00
2 ADMN-100 Friday 02:00:00 03:00:00
3 ADMN-100 Monday 01:00:00 02:00:00
4 LAB-501 Monday 01:00:00 02:00:00
使用LINQ,如何检查是否发生时间重叠?
我在下面做错了,
bool check = true;
check = db.Classrooms.Any(x => x.Classroom.Equals(roomNo)
&& x.Weekday.Equals(weekDay)
&& x.StartTime < startsAt
&& x.EndTime > startsAt);
答案 0 :(得分:3)
您的代码几乎正确,但将x.StartTime < startsAt
更改为x.StartTime < endsAt
。 Schedule
课程的完整性如下。
class Schedule
{
public string Classroom { get; set; }
public string Weekday { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public bool OverlapsWith(Schedule schedule)
{
return schedule.StartTime < EndTime &&
schedule.EndTime > StartTime &&
schedule.Weekday == Weekday &&
schedule.Classroom == Classroom;
}
}
快速说明 - 使用TimeSpan
,以便DateTime
对象在月,年或日关闭时不会弄乱您的逻辑。 What you really want is a time of day和TimeSpan
提供“小时”,“分钟”和“秒”,这是您真正想要的。比较将与TimeSpan
个对象一起使用。不过,我不确定这对EF有什么作用。
如果您需要转换字符串TimeSpan
,请尝试TimeSpan.Parse
。它应该适用于您在问题中提供的格式。
OverlapsWith
方法可能不在Schedule
内,但只是为了向您展示您的代码基本相同。
答案 1 :(得分:0)
为什么不尝试使用 class JobWithFirstOrCreate
analysis = Analysis.where(standard_id: standard_id).first_or_create
analysis.save!
end
方法?像这样:
Datetime.Compare()
答案 2 :(得分:0)
其他答案并未捕获所有可能的重叠案例。这就是你想要的。
check = classes.Any(x=>x.Classroom.Equals(roonNo)
&& x.Weekday.Equals(weekDay)
&& x.StartTime <= endsAt
&& x.EndTime >= startsAt);
答案 3 :(得分:0)
选择具有匹配结果的元素
var v= c.ones.Select(x=>x).Where(x => x.weekday.Equals("mon")
&& x.starttime == TimeSpan.Parse("08:00")
&& x.endtime == TimeSpan.Parse("09:00"));
查明是否存在重叠
IQueryable<bool> v= c.ones.Select(x => x.weekday.Equals("mon")
&& x.starttime == TimeSpan.Parse("08:00")
&& x.endtime == TimeSpan.Parse("09:00"));
答案 4 :(得分:0)
<强>解决强>
我想做这样的事情,因为我必须遍历每一行才能找到组合,
foreach (var val in DataSource)
{
if (roomNo.Equals(val.Classroom))
{
if (weekDay.Equals(val.ClassRoomWeekDay))
{
if (startsAt>= val.StartTime && startsAt< val.EndTime )
{
check = false;
}
}
}
}