2009-05-27 9 views
0

Comment allez-vous aujourd'hui? Je vous souhaite tout bien. En passant, voici mon problème. Je voudrais afficher le total de la durée de la somme dans gridview en utilisant LINQ to SQL. J'ai deux tables, les utilisateurs et Log_TimesComment faire pour totaliser la durée dans Gridview List en utilisant LINQ to SQL?

utilisateurs
UserID ----- Nom
1 ------------ Bob
2 --------- --- Mary
3 ------------ Jane

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

Il y en aurait tellement, si notre gentil homme peut générer un rapport qui ressemble à ceci:
UserName ------- TotalDuration
Bob --------------- 2 Heures, 10 Minutes
Mary ----------- --- 2 Heures, 5 Minutes
Jane -------------- 1 heure

J'utilise LINQ to SQL et VB.NET.

Le code que j'ai à ce jour est la suivante:

Dim db = new LogTimeDataContext
Dim LOGUSER = de lu dans db.Users select lu.Name, TotalDuration =? ? ?
Gridview1.DataSource = LOGUSER
Gridview1.DataBind()

S'il vous plaît et s'il vous plaît aidez-moi à comprendre ce qui est derrière ce code TotalDuration ..

Je vous remercie vraiment pour prendre votre temps précieux pour passer à travers ce problème et je suis impatient de la meilleure réponse à ce sujet. Merci beaucoup d'avance.

Répondre

0

La solution qui fonctionne bien est-ce.

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 

Par cela, je peux obtenir la seconde totale. Ensuite, je vais écrire une autre fonction dans gridview plus tard pour convertir de Second en minutes et heure.

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 

De cette façon, je pourrais obtenir ma colonne de durée dans le format d'heure, minute et Second.Happy codage :)

+0

Si le renvoi de tous les utilisateurs est l'exigence - votre réponse est correcte. Vous pouvez également combiner vos requêtes en une seule. Voir ma réponse mise à jour. –

+0

Désolé de répondre tard ... Je passais des vacances sans connexion internet. Merci beaucoup geoff pour le commentaire. Prends soin de toi et passe une bonne journée. :) – Vicheanak

0

Vous pouvez écrire quelque chose comme ça

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 }; 

Je ne sais pas si la partie de somme est correcte mais il est peut-être le genre de parcours que vous souhaitez descendre.

Je suis sûr que quelqu'un de plus expérimenté dans SQL pourrait modifier la requête pour être correct.

+0

Salut Dean. Je pense que votre requête ne peut me donner que la liste de l'utilisateur qui apparaît dans Log_Times seulement. Le but est d'obtenir tous les utilisateurs même s'ils ne se sont pas encore connectés ou déconnectés. Mais ils existent dans la table des utilisateurs. Merci beaucoup d'avoir essayé. – Vicheanak

0

Mise à jour:

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) 

La requête ci-dessous ne retourne les utilisateurs qui ont une entrée dans la table 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 

La dernière ligne vérifie juste que la durée est rien avant de se convertir à un timespan

+0

Bonjour, j'adore essayer. Cependant, si j'ai un autre utilisateur qui ne se connecte jamais. Il ne peut nous fournir que le rapport des seuls utilisateurs qui restent dans la table Log_Times uniquement. – Vicheanak

+0

Oh oui. Vous êtes très geoff logistique! Cela fonctionne comme le charme. Merci geoff! Codage heureux. – Vicheanak

Questions connexes