0

我被困在一个部分,我不知道如何解决它。基本上,我有一张桌子,“Shifthours”,另一张桌子是“employeeshift”。Shifthours 表有 shift_Start 和 shift_Stop。employeeshift 表有 StartTime 和 EndTime。我正在比较 shift_Start 和 StartTime。我已经使用外键将这两个表链接在一起,我问的问题是我希望 shift_Start 与 StartTime 进行比较,将 shift_Stop 与 EndTime 进行比较,并查看员工适合哪个班次,并且 shift_Start 和 shift_Stop 将出现在列中该雇员符合资格。

目前我得到了一个代码,它只将 2 个表连接在一起,但不比较时间。

private void LoadAllEmpShift()
    {
        using (testEntities Setupctx = new testEntities())
        {
            BindingSource BS = new BindingSource();
            var Viewemp = from ES in Setupctx.employeeshifts
                          join shifthour sh in Setupctx.shifthours on ES.ShiftHourID equals sh.idShiftHours
                         select new
                         {
                             ES.EmployeeShiftID,
                             ShiftHour_Start = sh.shiftTiming_start,
                             ShiftHour_Stop = sh.shiftTiming_stop,
                             ES.EmployeeName,
                             ES.StartTime,
                             ES.EndTime,
                             ES.Date
                         };


            BS.DataSource = Viewemp;
            dgvShift.DataSource = BS;
        }
    }

任何人都知道如何做到这一点?

4

1 回答 1

0

编辑:

您说您试图找到员工工作时间与一组轮班时间相匹配的位置。最好有一些样本数据和您想要用来确定什么是好的班次时间匹配的算法。

我在这里假设最好的方法是根据最近的班次开始时间来确定员工的开始时间。

在下面的代码中,我使用该let函数实质上查看轮班时间并找到最接近员工开始时间的轮班时间集。

var Viewemp = from ES in Setupctx.employeeshifts
      join sh in Setupctx.shifthours on ES.ShiftHourID equals sh.idShiftHours 
         into shifts
      let diff = shifts
          .OrderBy (s => 
                    // this is the line that needs attention:
                    System.Math.Abs((int)(ES.StartTime - s.shiftTiming_start))
                   )
                   .First ()
      select new
      {
          ES.EmployeeShiftID,
          ShiftHour_Start = diff.shiftTiming_start,
          ShiftHour_Stop = diff.shiftTiming_stop,
          ES.EmployeeName,
          ES.StartTime,
          ES.EndTime,
          ES.Date
      };

更新

我在数据库中的 StartTime 和 EndTime 类型是字符串而不是时间

ES.StartTime在上面的代码中,重要的逻辑是找到和之间的绝对值差s.shiftTiming_start,最小的差表示轮班时间的最佳匹配。不幸的是,您的数据库将此数据存储为字符串,您需要将它们作为数字进行比较。

Linq-to-Entities 不包含转换stringint函数的简单方法。

我认为您的下一步是研究如何将这些string值转换为int值。看看这个问题,因为我认为它可能会帮助你:

在 EF 4.0 中将 String 转换为 Int

于 2012-07-19T02:23:56.993 回答