c# - LINQ to SQL 求和空值

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

我有以下查询,我也想对 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?(可为空),而 TimeInDateTime (不可为空)。我认为这是有道理的。

  • 我假设 TimeSheets 有一个 StudentId 将它们链接到学生。

关于c# - LINQ to SQL 求和空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3527912/

相关文章:

c# - 如何在 DataTable 中使用 LINQ?

c# - 如何为 IEnumerable.Any 编写 Linq.Expression

c# - 有没有办法在 ASP Net/ASP Net Core 中使用 URL 路径段中的参数

vb.net - 如何从 VB.NET 的列表中找到对象的索引?

javascript - 更改 Javascript 来更新面板

asp.net - 从 URLReferrer 获取查询字符串

c# - 从另一个列表对象创建对象列表 LINQ Lambda

c# - 替换为 .Replace/.Regex

c# - 如何拥有一个密封的构造函数?

c# - 如何找到同一个对象在列表中出现了多少次,然后找到出现次数最多的对象的属性