28

I'm having a hard time understanding how I can form a LINQ query to do the following:

I have a table CallLogs and I want to get back a single result which represents the call that has the longest duration.

The row looks like this:

[ID] [RemoteParty] [Duration]

There can be multiple rows for the same RemoteParty, each which represents a call of a particular duration. I'm wanting to know which RemoteParty has the longest total duration.

Using LINQ, I got this far:

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

So now I have a grouped result with the total duration for each RemoteParty but I need the maximum single result.

[DistinctRemoteParty1] [Duration]

[DistinctRemoteParty2] [Duration]

[DistinctRemotePartyN] [Duration]

How can I modify the query to achieve this?

2 Answers 2

26

Order the result and return the first one.

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();
Sign up to request clarification or add additional context in comments.

Comments

4

Have a look at the "Max" extension method from linq

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

1 Comment

That would only return the maximum TotalDuration without the RemoteParty part.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.