我有以下代码,它应该遍历每个工作人员的时间表,以便比较日期和时间。
在我目前的情况下,我有3行/日程表为同一个工作人员,但foreach循环只需要一行进行比较。出于这个原因,我得到了错误的结果。
我也尝试使用嵌套的foreach循环,但是我收到了重复的结果。 汤姆被展示了2次。布莱恩和蒂姆不包括在内。
示例: 在员工表中,我有4名成员:
在计划程序模板中,我有以下内容:
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;
我在上面的代码中遗漏了什么?
答案 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);
}