我有以下查询,我也想对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,是因为我不太了解您的分组情况如何,但是由于它不在输出中,因此我怀疑您可能不需要它。

我不得不做一些假设:


我假设TimeOutDateTime?(可为空),而TimeInDateTime(不可为空)。我认为这是有道理的。
我假设TimeSheets具有将它们链接到学生的StudentId

10-06 01:21