2010-08-20 59 views
2

我有以下查询,我也想总结NULL值。一些TimeSheet不记录在TimeRecord中,有些tr.TimeIn和tr.TimeOut是NULL。LINQ to SQL sum null值

查询选择具有reords在TimeRecord仅考勤卡]。我怎样才能让它选择一切,并总结NULL值。所以,NULL的SUM将只是零。

表关系:

  • 学生1:N的TimeSheet(FK StudentId)
  • 的TimeSheet 1:N TimeRecord(FK TimeSheetId)

TimeIn和超时是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与主动的TimeSheet学生:

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小时0mm时0秒
  • 2655 - 160:93个小时33毫米50秒
  • 1566 - 161:37个小时23毫米53秒
  • 3114 - 162:25个小时0毫米21秒

同样为查询1,但它使每月报告。

+0

只是提示下一次您发布的问题 - 问题是关于总结空记录,所以剥去一切不是**严格**与它有关。解决核心问题最好不要处理你的案件几年,几个月,学生等。简单地说 - 尊重别人的时间。 – greenoldman 2010-08-20 05:33:06

回答

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是它们链接到的学生。

+0

MonthYear是alos输出。我需要每个学生每月的时间表。 TimeIn和TimeOut DatTime(可空)。表关系学生1:N TimeSheetId(FK StudentId),时间表1:N TimeRecord(FK TimeSheetId) – Narazana 2010-08-20 03:53:05

+0

我加了查询2,我认为这是相当于你上面的C#和Talbe关系也。请参阅更新中的问题。 – Narazana 2010-08-20 04:08:01

+0

恐怕我不能为你完成你的全部功课。请运行我的查询,查看输出,看看它是否做到了你想要的。如果没有,那么描述它需要不同的方式。 – Timwi 2010-08-20 04:11:01