使用LINQ检查计划重叠

时间:2016-05-06 13:44:32

标签: c# sql asp.net-mvc entity-framework linq

我有一张如下表

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);

5 个答案:

答案 0 :(得分:3)

您的代码几乎正确,但将x.StartTime < startsAt更改为x.StartTime < endsAtSchedule课程的完整性如下。

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 dayTimeSpan提供“小时”,“分钟”和“秒”,这是您真正想要的。比较将与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;
                    }

                }
            }

        }