Foreach循环只返回一个数据

时间:2017-07-22 11:00:52

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

我有以下代码,它应该遍历每个工作人员的时间表,以便比较日期和时间。

在我目前的情况下,我有3行/日程表为同一个工作人员,但foreach循环只需要一行进行比较。出于这个原因,我得到了错误的结果。

我也尝试使用嵌套的foreach循环,但是我收到了重复的结果。 汤姆被展示了2次。布莱恩和蒂姆不包括在内。

示例: 在员工表中,我有4名成员:

  1. 亚历
  2. 汤姆
  3. 布赖恩
  4. 在计划程序模板中,我有以下内容:

    1. Alex > 2017年8月1日> 09:55 - 10:55 - 所有者
    2. Tom > 2017年8月1日> 10:10 - 11:10
    3. Tom > 2017年8月1日> 13:45 - 14:45
    4. Tom > 2017年8月1日> 15:30 - 16:30
    5. Alex是所选计划的所有者,希望将其转移给另一位可用的工作人员。所以,这个Alex不应该显示在列表中。

      汤姆在选定的日程安排日期的同一天有三次约会,因为他在10:10到11:10之间忙碌,所以他在09:55 - 10:55之间无法参加。因此,结果应仅显示Bryan和Tim。

      在下面的代码中,由于我的代码没有循环通过Tom的其他约会,因此我将他列入列表中,因为我的代码只需要15:30,并且需要作为可用的工作人员。

      实体 https://gist.github.com/anonymous/5300584578130c39413784d2e3c2f7d4

      var selectedSchedule = await db.SchedulerTemplate.FirstOrDefaultAsync(s => s.SchedulerTemplateId == stid);
      var startTime = selectedSchedule.Time;
      var endTime = selectedSchedule.Time.AddMinutes(selectedSchedule.Duration);
      
      var staff = await db.Staff.Where(x => x.Deleted == false).Select(c => new TransferViewModel()
      {
          UserId = c.UserId,
          FullName = c.FirstName + " " + c.LastName,
      }).ToListAsync();
      
      var staffList = new List<TransferViewModel>();
      
      foreach (var s in staff)
      {
          if (selectedSchedule.ForUserId != s.UserId)
          {
              var staffSchedule = await db.SchedulerTemplate.FirstOrDefaultAsync(
              ss => ss.Date == selectedSchedule.Date && ss.ForUserId == s.UserId && ss.Deleted == false);
      
              if (staffSchedule != null)
              {
                  var st = staffSchedule.Time;
                  var et = st.AddMinutes(staffSchedule.Duration);
      
                  if (! (startTime.TimeOfDay < et.TimeOfDay && st.TimeOfDay < endTime.TimeOfDay))
                  {
                      staffList.Add(s);
                  }
              }
              else
              {
                  staffList.Add(s);
              }
          }
      }
      
      ViewData["availableStaff"] = staffList;
      

      我在上面的代码中遗漏了什么?

1 个答案:

答案 0 :(得分:2)

您正在循环工作人员,但没有正确查询他们的日程安排。

您可以更改查询以包含所有相关业务逻辑并删除if语句。

由于我不确定是否通过实体框架获取TimeOfDay,因此我在第一次查询后首先调用ToList来实现它,然后我们可以使用支持它的linq-to-object。

因此,我们不会FirstOrDefault使用Where来获取所有记录,而是验证所有记录都不在时间范围内。

bool isAvailable = await db.SchedulerTemplate
    .Where(ss => ss.Date == selectedSchedule.Date && ss.ForUserId == s.UserId && ss.Deleted == false)
    .ToList()
    .All(ss=> !(startTime.TimeOfDay < ss.Time.AddMinutes(staffSchedule.Duration).TimeOfDay && ss.Time.TimeOfDay < endTime.TimeOfDay))

if (isAvailable)
{
    staffList.Add(s);
}