如何使用LINQ补全司机任务表的24小时单元格空缺?
使用LINQ补全24小时任务槽的空缺数据
解决方案思路
要实现24个单元格对应一天24小时、自动补全空缺的需求,核心思路是先生成包含24个空时间槽的基础集合,再将数据库查询到的任务匹配填充到对应小时的槽位中,最终得到完整的24元素集合供前端渲染。
具体实现步骤
1. 定义数据传输对象(DTO)
由于原实体类可能存在必填字段,空槽需要默认值,建议创建一个专门的DTO来承载每个小时槽的数据:
public class DriverHourSlot { public int Hour { get; set; } // 对应1-24小时的单元格序号 public TimeSpan? FromTime { get; set; } public TimeSpan? ToTime { get; set; } public string Destination { get; set; } public bool IsConfirmed { get; set; } public string DriverName { get; set; } }
2. 生成24小时空槽集合
先创建包含1到24小时的空槽列表,每个槽位初始化为默认空值:
// 生成1-24小时的空槽 var hourSlots = Enumerable.Range(1, 24) .Select(hour => new DriverHourSlot { Hour = hour }) .ToList();
3. 查询并关联目标日期的任务数据
从数据库中查询指定日期的司机任务,并关联司机信息(用于前端显示司机姓名):
DateTime targetDate = new DateTime(2022, 8, 23); // 替换为你需要查询的日期 var tasks = _context.driversTasks .Where(t => t.AtDate.Date == targetDate) // 匹配日期(忽略时间部分) .Include(t => t.driv) // 关联司机表(假设driv是导航属性) .OrderBy(t => t.FromTime) .ToList();
4. 将任务填充到对应小时槽
根据任务的FromTime确定其所属的小时槽,将任务数据填充到对应槽位:
foreach (var task in tasks) { // 处理00:00的情况,对应24小时槽 int targetHour = task.FromTime.Hours == 0 ? 24 : task.FromTime.Hours; // 找到对应的小时槽 var targetSlot = hourSlots.First(slot => slot.Hour == targetHour); // 填充任务数据 targetSlot.FromTime = task.FromTime; targetSlot.ToTime = task.ToTime; targetSlot.Destination = task.Destination; targetSlot.IsConfirmed = task.IsConfirmed; targetSlot.DriverName = task.driv.Name; }
5. 修改前端渲染代码
将hourSlots作为Model传给前端,修改前端代码以正确渲染24个单元格:
<tbody id="mytable"> <tr> <!-- 仅显示一次司机姓名 --> <th scope="row">@Model.FirstOrDefault()?.DriverName ?? ""</th> @foreach (var slot in Model) { <td data-from="@slot.FromTime" data-to="@slot.ToTime"> @slot.Hour - @(slot.FromTime.HasValue ? slot.FromTime.Value.ToString(@"hh\:mm\:ss") : "") </td> } </tr> </tbody>
效果说明
- 生成的
hourSlots集合固定包含24个元素,对应1-24小时的单元格,空缺的槽位保持空值。 - 任务会自动匹配到其起始时间对应的小时槽(例如
02:30:00的任务会填充到第2个单元格),解决了你提到的“FromTime从索引2开始”的需求。 - 前端会渲染出完整的24个单元格,直到第24个槽位,满足填充至索引24的要求。
内容的提问来源于stack exchange,提问作者Mohamed Abuelatta
相关产品推荐
相关产品推荐

