我被困在一个部分,我不知道如何解决它。基本上,我有一个表,“Shifthours”和另一个表“雇员转移”。 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;
}
}
任何人都知道如何做到这一点?
答案 0 :(得分: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不包含将string
转换为int
函数的简便方法。
我认为您的下一步是研究如何将这些string
值转换为int
值。看看这个问题,因为我认为它可以帮到你: