views:

72

answers:

2

This doesn't seem to work as I intend.

VB.NET:

Dim x = Model.Discussions.OrderByDescending(Function(d) d.Messages.OrderByDescending(Function(m) m.Sent).First.Sent)
For Each d As Discussion In x
    ...
Next

I get this runtime error:

Sequence contains no elements

There should be 20.

Discussions are collections of messages.

I want to sort my discussions by the age of the newest message of each.

Clarification

I need to sort my discussions, not my messages. I want to sort my discussions by an aggregate calculation: MAX(Sent) among the messages of each.

+5  A: 

You need to use .OrderByDescending().ThenBy();

Agent_9191
I don't think that sounds right. I want to sort my discussions by an aggregate calculation based on the messages of each.
Zack Peterson
Judging by his query, it's not quite what he means. He wants to sort discussions by date of the latest message in them.
Pavel Minaev
+4  A: 

I don't think you need OrderBy in the inner query at all - use Max (or Min):

Model.Discussions.OrderByDescending( _
    Function(d) d.Messages.Max(Function(m) m.Sent))

Though in VB, I'd rather use a query comprehension:

From d In Model.Discussions _
Order By (Aggregate m In d.Messages Into Max(m.Sent)) Descending _
Select d

The reason why you've got the error that you did is, apparently, because you have some discussion with no messages; hence calling First thrown an exception. Max will do the same. I'm not sure if this is a problem with your data set (it doesn't seem like it's reasonable to have a discussion with no messages in it), but if it is, you need to use Enumerable.Empty() for an extra check.

Pavel Minaev
Perfect. Thank you.
Zack Peterson
All discussions do have 1 or more messages. But in this case they had not yet been loaded from the database. d.Messages.IsLoaded = False
Zack Peterson