我有以下查询,我也想对 NULL 值求和。有的TimeSheet不记录TimeRecord,有的tr.TimeIn和tr.TimeOut为NULL。
查询仅选择在 TimeRecord 中有记录的 TimeSheet。我如何让它选择所有内容,并总结 NULL 值。因此,NULL 的 SUM 将为零。
表关系:
- 学生 1:N 时间表(FK StudentId)
- TimeSheet 1:N TimeRecord (FK TimeSheetId)
TimeIn 和 TimeOut 是 DateTime 类型并且可以为空。
Query 1: Monthy Report:
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
Query 2: Total TimeRecord for Student with Active 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 hr 0mm 0 sec
- 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
将它们链接到学生。
关于c# - LINQ to SQL 求和空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3527912/