LINQ to SQL和null值

时间:2010-08-20 03:08:02

标签: c# vb.net linq linq-to-sql .net-3.5

我有以下查询,我也要将NULL值相加。一些TimeSheet不在TimeRecord中记录,一些tr.TimeIn和tr.TimeOut都是NULL。

查询仅选择在TimeRecord中包含reords的TimeSheet。如何让它选择所有内容,并总结NULL值。因此,NULL的SUM将只为零。

表关系:

  • 学生1:N时间表(FK StudentId)
  • 时间表1:N TimeRecord(FK TimeSheetId)

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的结果:

  • 734 - 159:9小时35毫米28秒
  • 2655 - 160:93小时33毫米50秒
  • 1566 - 161:37 hrs 23 mm 53 sec
  • 3114 - 162:25小时0毫米21秒

查询2的结果:

  • 733 - 158:0 hr 0mm 0 sec
  • 734 - 159:9小时35毫米28秒
  • 736 - 169:0小时0毫米0秒
  • 2655 - 160:93小时33毫米50秒
  • 1566 - 161:37 hrs 23 mm 53 sec
  • 3114 - 162:25小时0毫米21秒

查询1相同,但它会进行月度报告。

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这个东西,因为我真的不明白你的分组是怎么合适的,但由于它不在输出中,我怀疑你可能不需要它。

我必须做出一些假设:

  • 我假设TimeOutDateTime?(可空),而TimeInDateTime(不可为空)。我认为这是有道理的。

  • 我假设TimeSheets有StudentId将它们与学生联系起来。