2009-01-31 7 views
28

Je vais avoir du mal à comprendre comment je peux former une requête LINQ pour effectuer les opérations suivantes:C# LINQ Requête - Grouper par

J'ai CallLogs de table et je veux revenir un seul résultat qui représente la appel qui a la plus longue durée.

La ligne ressemble à ceci:

[ID] [RemoteParty] [Durée]

Il peut y avoir plusieurs lignes pour la même RemoteParty, chacun qui représente un appel d'une durée particulière . Je veux savoir quelle RemoteParty a la durée totale la plus longue.

LINQ, je suis arrivé jusqu'ici:

var callStats = (from c in database.CallLogs 
       group c by c.RemoteParty into d 
       select new 
       { 
         RemoteParty = d.Key, 
         TotalDuration = d.Sum(x => x.Duration) 
       }); 

Alors maintenant, j'ai un résultat groupé avec la durée totale pour chaque RemoteParty mais je dois le seul résultat maximal.

[DistinctRemoteParty1] [Durée]

[DistinctRemoteParty2] [Durée]

[DistinctRemotePartyN] [Durée]

Comment puis-je modifier la requête pour y parvenir?

Répondre

26

Commandez le résultat et renvoyez le premier.

var callStats = (from c in database.CallLogs 
       group c by c.RemoteParty into d 
       select new 
       { 
         RemoteParty = d.Key, 
         TotalDuration = d.Sum(x => x.Duration) 
       }); 

callStats = callStats.OrderByDescending(a => a.TotalDuration) 
        .FirstOrDefault(); 
4

Jetez un oeil à la méthode d'extension "Max" de LINQ

callStats.Max(g=>g.TotalDuration); 
+0

Cela ne ferait que renvoyer le TotalDuration maximum sans la partie RemoteParty. – configurator