我有以下查询,我也想对NULL值求和。某些TimeSheet不在TimeRecord中记录,而某些tr.TimeIn和tr.TimeOut为NULL。
该查询仅选择在TimeRecord中具有相关性的TimeSheet。我怎样才能选择所有内容,并总结NULL值。因此,NULL的总和将仅为零。
表关系:
学生1:N时间表(FK StudentId)
TimeSheet 1:N TimeRecord(FK TimeSheetId)
TimeIn和TimeOut是DateTime类型,可以为空。
查询1:蒙蒂报告:
Dim query = From ts In db.TimeSheets _
Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
Where ts.IsArchive = False And ts.IsCompleted = False And tr.TimeOut IsNot Nothing _
Group By key = New With {ts.Student, .MonthYear = (tr.TimeOut.Value.Month & "/" & tr.TimeOut.Value.Year)} Into TotalHour = Sum(DateDiffSecond(tr.TimeIn, tr.TimeOut)) _
Select key.Student.StudentId, key.Student.AssignedId, key.MonthYear, TotalHour
查询2:具有活动TimeSheet的学生的总TimeRecord:
Dim query = From ts In db.TimeSheets _
Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
Where ts.IsArchive = False And ts.IsCompleted = False _
Group By ts.StudentId, tr.TimeSheetId Into TotalTime = Sum(DateDiffSecond(tr.TimeIn, tr.TimeOut)) _
Select StudentId, TimeSheetId, TotalTime
这是查询2的结果:
734-159:9小时35毫米28秒
2655-160:93小时33毫米50秒
1566-161:37小时23毫米53秒
3114-162:25小时0毫米21秒
查询2的结果:
733-158:0小时0毫米0秒
734-159:9小时35毫米28秒
736-169:0小时0毫米0秒
2655-160:93小时33毫米50秒
1566-161:37小时23毫米53秒
3114-162:25小时0毫米21秒
与查询1相同,但它每月报告一次。
最佳答案
很抱歉,因为在调整之前将查询翻译为C#,但我不太了解VB语法,无法将其翻译回来,但我希望您能够。我尝试了以下查询,它可以满足您的要求:
var query = from st in Students
select new
{
st.StudentId,
st.AssignedId,
TotalHour = (
from ts in TimeSheets
where ts.StudentId == st.StudentId
join tr in TimeRecords on ts.TimeSheetId equals tr.TimeSheetId
where !ts.IsArchive && !ts.IsCompleted && tr.TimeOut != null
select (tr.TimeOut.Value - tr.TimeIn).TotalHours
).Sum()
};
我必须删除
MonthYear
,是因为我不太了解您的分组情况如何,但是由于它不在输出中,因此我怀疑您可能不需要它。我不得不做一些假设:
我假设
TimeOut
是DateTime?
(可为空),而TimeIn
是DateTime
(不可为空)。我认为这是有道理的。我假设TimeSheets具有将它们链接到学生的
StudentId
。