我有以下查询,我也要将NULL值相加。一些TimeSheet不在TimeRecord中记录,一些tr.TimeIn和tr.TimeOut都是NULL。
查询仅选择在TimeRecord中包含reords的TimeSheet。如何让它选择所有内容,并总结NULL值。因此,NULL的SUM将只为零。
表关系:
TimeIn和TimeOut是DateTime类型且可以为空。
查询1: Monthy报告:
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:具有有效时间表的学生的总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的结果:
查询2的结果:
查询1相同,但它会进行月度报告。
答案 0 :(得分: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
将它们与学生联系起来。