c# - Entity Framework - groupby 和时间跨度计算

标签 c# sql linq entity-framework

我想计算每个人在EF的总小时数。 我可以在 MYSQL 语句中计算总小时数,但 EF 有问题。

这是SQL语句

SELECT name, SEC_TO_TIME(Sum(TIME_TO_SEC(TIMEDIFF(ClockOutTime,ClockInTime)))) 
FROM Attendance 
GROUP BY name

我想将上面的语句转换为EF。

这是我迄今为止在 Controller 中所拥有的内容

 var model = db.Attendances
            .GroupBy(a => a.name)
            .Select(g => new AttendanceViewModel
            {
                name = g.Key,
                totalHours = SqlFunctions.DateDiff("seconds",
                                                   g.Select( a=> a.ClockInTime),
                                                   g.Select(a=>a.ClockOutTime))
            }).ToList();

我遇到的问题是 g.Select( a=>a.ClockInTime) 返回 IEnumrable,因此我不能直接使用 SqlFunctions.DateDiff 。我该如何解决这个问题?还有其他方法吗?

最佳答案

您可以选择每次出勤的时间并在分组后进行总计计算

  db.Attendances
    .Select(a => new {
        a.name,
        hours = SqlFunctions.DateDiff("seconds", a.ClockInTime, a.ClockOutTime)
    })
    .GroupBy(x => x.name)
    .Select(g => new AttendanceViewModel {
        name = g.Key,
        totalHours = Sum(x => x.hours)
    })
   .ToList();

顺便说一句,如果您计算的是秒,为什么您将属性命名为“小时”?

关于c# - Entity Framework - groupby 和时间跨度计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17143359/

相关文章:

sql - sql 中的默认约束为 NULL NOT NULL

mysql - 使用 in 命令创建 SQL View 命令

c# - 如果我使用类似 NHibernate 的 ORM,为什么还需要 LINQ?

c# - 为什么 catch 语句不捕获所有异常?

javascript - 使用 JSInterop 将对象传递给 JavaScript 结果为空对象

sql - 如何删除SQL中两个单词之间的空格(更多两个空格)

c# - 如果未找到项目,为什么 LINQ 的 First 方法不简单地返回 null?

c# 如何将变量从方法传递到 main?

c# - C# 中的 MongoDB 地理空间索引

c# - linq to object 使用元组列表