【问题标题】:How to Sum the duration in Gridview List by using LINQ to SQL?如何使用 LINQ to SQL 对 Gridview 列表中的持续时间求和?
【发布时间】:2009-05-27 06:39:17
【问题描述】:

你今天好吗?祝你们一切顺利。

顺便说一下,这是我的问题。我想使用 LINQ to SQL 在 gridview 中显示总和持续时间。我有两个表,Users 和 Log_Times

用户
用户ID-----姓名
1------------鲍勃
2------------玛丽
3------------简

Log_Times
ID---------------UserID--------TimeIn------------ ---------超时
1--------------------------------1------------2009 年 1 月 1 日10:00:00-------2009 年 1 月 1 日 11:05:00
2---------------------2------------------------------------ 2009 年 1 月 1 日10:00:00-------2009 年 1 月 1 日 11:02:30
3--------------------3------------------------2009 年 1 月 1 日10:00:00-------2009 年 1 月 1 日 11:00:00
4---------------------1------------------------ 2009 年 1 月 2 日10:00:00--------2009 年 1 月 2 日 11:05:00
5--------------------2------------------------------------ 2009 年 1 月 2 日10:00:00-------2009 年 1 月 2 日 11:02:30

如果我们的绅士可以生成如下所示的报告,那就太好了:
用户名-------TotalDuration
Bob---------------2 小时 10 分钟
玛丽--------------2 小时 5 分钟
简--------------1 小时

我正在使用 LINQ to SQL 和 VB.NET。

我目前的代码是:

暗 db = 新 LogTimeDataContext
Dim LogUser = from lu in db.Users select lu.Name, TotalDuration = ? ? ?
Gridview1.DataSource = LogUser
Gridview1.DataBind()

请帮我弄清楚这个 TotalDuration 代码背后的原因..

非常感谢您抽出宝贵的时间来解决这个问题,我期待着最好的回应。非常感谢你提前。

【问题讨论】:

    标签: vb.net linq


    【解决方案1】:

    你可以这样写

    from t in db.Log_Times 
    join u in db.Users on t.UserID equals u.UserID 
    select new {user = u.name, Sum(t.TimeOut - t.TimeIn) AS Duration };
    

    我不知道总和部分是否正确,但它可能是您想要走的那种路线。

    我确信在 SQL 方面更有经验的人可以将查询修改为正确。

    【讨论】:

    • 嗨,院长。我认为您的查询只能给我出现在 Log_Times 中的用户列表。关键是让每个用户即使他们还没有登录或注销。但它们存在于用户表中。非常感谢您的尝试。
    【解决方案2】:

    运行良好的解决方案是这个。

    Imports System.Data.Linq.SqlClient 
    
    Dim QueryLogUser = from u in db.Users 
    Select u.Name, Duration = u.Log_Times.Select (Function(lt) SqlMethods.DateDiffSecond(lt.TimeIn, lt.TimeOut))
    
    Dim LogUser = From u In QueryLogUser.AsEnumerable _
    Select u.Name, TotalDuration = u.Duration.Sum Order By TotalDuration Descending
    

    由此我可以得到总秒数。然后我会在gridview中再写一个函数,将秒转换为分钟和小时。

    Dim totalSecond as Integer
    Dim totalMinute as Integer
    Dim totalHour as Integer
    
    Protected Function FieldDisplayDuration(ByVal Second As Integer)
     Dim d As String = "DefaultValue"
     If (Second > 60)
       totalSecond = Second mod 60
       totalMinutes = Second / 60
       If (totalMinutes > 60)
          totalHour = totalMinute mod 60
          totalMinute = totalMinute + totalMinute mod 60
          return totalHour & totalMinute & totalSecond
       End If
       return totalMinute & totalSecond
     End If
     return totalSecond
    
    End Function
    

    通过这种方式,我可以得到小时、分钟和秒格式的持续时间列。快乐编码:)

    【讨论】:

    • 如果返回所有用户是要求 - 你的答案是正确的。您还可以将查询合并为一个查询。请参阅我的更新答案。
    • 抱歉回复晚了...我正在度假,没有互联网连接。非常感谢杰夫的评论。保重,有一个美好的一天。 :)
    【解决方案3】:

    更新:

    Dim QueryLogUser = from u in db.Users 
                       Select u.Name, Duration = u.Log_Times.Select (Function(lt) SqlMethods.DateDiffSecond(lt.TimeIn, lt.TimeOut)).Sum).OrderbyDescending(function(o) o.Duration)
    

    下面的查询只返回在 Log_times 表中有条目的用户。

    Imports System.Data.Linq.SqlClient
    
    Dim db = New LogTimeDataContext
    Dim LogUser = From log In db.Log_Times _
                  Group By _
                     Name = log.User.Name _
                  Into _
                     Duration = Sum(SqlMethods.DateDiffMinute(log.TimeIn,log.TimeOut) _
                  Select name, TotalDuration = TimeSpan.FromMinutes(If(Duration,0)).tostring
    

    最后一行只是在转换为时间跨度之前检查持续时间是否为空

    【讨论】:

    • 你好,很好的尝试。但是,如果我还有一个从不登录和退出的用户。它可以只为我们提供仅留在 Log_Times 表中的唯一用户的报告。
    • 哦,是的。你是个非常后勤的杰夫!它就像魅力一样。谢谢杰夫!编码愉快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多