2009-05-27 23 views
0

你今天過得如何?祝你一切順利。如何通過使用LINQ to SQL來總結Gridview List中的持續時間?

順便說一句,這是我的問題。我想通過使用LINQ to SQL在gridview中顯示總持續時間的總和。我有兩個表,用戶和Log_Times

用戶
用戶名-----名稱
1 ------------鮑勃
2 --------- --- Mary
3 ------------簡

Log_Times
ID --------------- UserID ------- ------------- TimeIn --------------------- TimeOut
1 ----------- --------- 1 ----------------------- 1/1/2009 10:00:00 ------- 1/1/2009 11:05:00
2 -------------------- 2 ---------------- ------- 1/1/2009 10:00:00 ------- 1/1/2009 11:02:30
3 -------------------- 3 ------------------- ---- 1/1/2009 10:00:00 ------- 1/1/2009 11:00:00
4 ---------------- ---- 1 ----------------------- 1/2/2009 10:00:00 ------- 1/2/2009 11:05:00
5 -------------------- 2 --------------------- - 1/2/2009 10:00:00 ------- 1/2/2009 11:02:30

如果我們的溫柔的男人能夠產生看起來像這:
用戶名------- TotalDuration
鮑勃--------------- 2小時10分鐘
瑪麗------------ --- 2小時,5分鐘
簡-------------- 1小時

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

我到目前爲止的代碼是:

昏暗DB =新LogTimeDataContext
暗淡LOGUSER =從魯中db.Users選擇lu.Name,TotalDuration =? ? ?
Gridview1.DataSource = LOGUSER
Gridview1.DataBind()

請,請您幫我弄清楚這背後TotalDuration代碼..

我真的很感謝抽出寶貴的時間來通過這個問題,我期待着最好的迴應。非常感謝你提前。

回答

0

這是工作的罰款解決的辦法是在此之前沒有。

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中再寫一個函數,將其從Second轉換爲分鐘和小時。

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 

這樣,我能得到的小時,分​​鐘的格式我的時間列,Second.Happy編碼:)

0

你可以寫這樣的事情

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更有經驗可以修改查詢是正確的。

+0

嗨院長。我認爲你的查詢可能只給出僅出現在Log_Times中的用戶列表。重點是讓每一個用戶即使他們還沒有登錄或註銷。但它們存在於Users表中。非常感謝您的努力。 – Vicheanak 2009-05-29 03:46:18

0

更新:

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 

最後一行只檢查持續時間不轉換爲時間跨度

+0

你好,很高興嘗試。但是,如果我有另外一個用戶永遠不會登錄和註銷。它只能給我們留下只留在Log_Times表中的唯一用戶的報告。 – Vicheanak 2009-05-29 03:44:31

+0

哦,是的。你是非常物流的geoff!它的作用像魅力。謝謝傑夫!快樂的編碼。 – Vicheanak 2009-05-31 11:21:17

相關問題