【问题标题】:Check schedule overlap using LINQ使用 LINQ 检查计划重叠
【发布时间】:2016-09-01 14:57:08
【问题描述】:

我有一张像下面这样的表格

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

【问题讨论】:

  • 您在这里有点遗漏了一些细节,但是您的标志翻转了吗?你不应该检查开始时间是否比startsAt早
  • 我觉得应该是startsAt &gt; x.StartTime &amp;&amp; x.EndTime &gt; startsAt
  • StartTime/EndTime 是字符串对象还是其他一些对象类型?如果它们是 DateTime 对象,它们的年/月/日组成部分是什么?
  • 检查重叠的方法是start1 &lt; end2 &amp;&amp; start2 &lt; end1
  • Casey、Arturo Menchaca 和 juharr,你们是对的。更改了问题以及我的代码。但还没有解决。

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


【解决方案1】:

已解决

我想做这样的事情,因为我必须遍历每一行才能找到组合,

foreach (var val in DataSource)
        {
            if (roomNo.Equals(val.Classroom))
            {
                if (weekDay.Equals(val.ClassRoomWeekDay))
                {
                    if (startsAt>= val.StartTime && startsAt< val.EndTime )
                    {
                        check = false;
                    }

                }
            }

        }

【讨论】:

    【解决方案2】:

    选择匹配结果的元素

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

    【讨论】:

      【解决方案3】:

      您的代码几乎正确,但将x.StartTime &lt; startsAt 更改为x.StartTime &lt; 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 dayTimeSpan 提供您真正想要的“小时”、“分钟”和“秒”。比较将适用于 TimeSpan 对象。不过,我不确定这将如何与 EF 一起使用。

      如果您需要将字符串转换为TimeSpan,请尝试TimeSpan.Parse。它应该适用于您在问题中提出的格式。

      OverlapsWith 方法可能不在Schedule 内部,但它的存在只是为了向您表明您的代码基本相同。

      【讨论】:

      • TimeSpan 的问题在于它给出的是经过的时间,而不是一天中的时间。
      • “从一天开始经过的时间”与“一天中的时间”相同。以这种方式解释TimeSpan 是我所知道的最接近的方法。查看 link in the question 以获取有关该主题的另一篇 SO 帖子。
      • 请注意,这将强制用户使用 24 小时制。只要确保您记得在需要时进行转换。但是,我认为这是要走的路。点赞。
      • 是的,我的 Class 属性已像您所显示的那样声明。
      • @Tareq 你还有问题吗?哪种情况不起作用?在您的 4 个时间表示例中,我没有看到任何重叠。您正在测试更多数据吗?
      【解决方案4】:

      其他答案并未涵盖所有可能的重叠情况。这就是你想要的。

      check = classes.Any(x=>x.Classroom.Equals(roonNo)
                             && x.Weekday.Equals(weekDay)
                             && x.StartTime <= endsAt
                             && x.EndTime >= startsAt);
      

      【讨论】:

      • 如果你没有endsAt时间,你可以在两个地方都使用startsAt,结果是一样的。虽然这会降级为马特罗兰兹的回答。
      【解决方案5】:

      您为什么不尝试使用Datetime.Compare() 方法?像这样:

      .Any(
      Datetime.Compare(x.StartTime, startsAt)>0 
      &&
      Datetime.Compare(x.EndTime, startsAt)<0
      )
      

      【讨论】:

      • 我认为DateTime.Compare 不会在 EF 中转换为 SQL。但实际上它与仅使用运算符并没有什么不同。
      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      相关资源
      最近更新 更多