GroupBy and OrderBy in MultiMap/Reduce

51 views
Skip to first unread message

Inveritas

unread,
May 7, 2012, 8:40:29 AM5/7/12
to ravendb
Hi Mailing list,

I have following reduce in a MultiMap/Reduce:


Reduce = results => from result in results
group result by result.GroupId
into g
select new
{
GroupId = g.Key,
Contacts= g.Select(x =>
x.Contacts).FirstOrDefault(x => x != null),
Subject = g.Select(x =>
x.Subject).FirstOrDefault(x => x != null),
Text = g.Select(x =>
x.Text).FirstOrDefault(x => x != null),
SendDate = g.Select(x =>
x.SendDate).FirstOrDefault(x => x != null),
};

..and it returns this aggregated Message:

{
"GroupId": "groups/1505",
"Contacts": [
"fr...@test.com",
"t...@test.com"
],
"Subject": "Latest message",
"Text": "This should be my latest message",
"SendDate": "20120505220951000"
}


Now I need to get the latest Message in each Group. I guess I need to
OrderByDescending on SendDate before the actual aggregation is done. I
have tried order by in some places but it I will not work, just get an
empty result.

Thankful For Any Help.

Ryan Heath

unread,
May 7, 2012, 9:17:27 AM5/7/12
to rav...@googlegroups.com
How about something like:

Reduce = results => from result in results
group result by result.GroupId
into g
let firstMessage = (from m in g order by m.SendDate).First()
let lastMessage = (from m in g order by m.SendDate desc).First()
select new
{
...
// use first and last messages
...
};

// Ryan

Inveritas

unread,
May 7, 2012, 9:48:51 AM5/7/12
to ravendb
That looks like it should work. I've changed my code according to
yours but still get empty result, here is my Query:

Reduce = results => from result in results
group result by result.GroupId
into g
let latestMessage = (from m in g
orderby m.SendDate descending select m).FirstOrDefault()
select new
{
GroupId = g.Key,
Emails = latestMessage.Emails,
Contacts = latestMessage.Contacts,
Subject = latestMessage.Subject,
IntroText =
latestMessage.IntroText,
SendDate = latestMessage.SendDate
};

Have I missed something here?

/Mase
> >    "f...@test.com",

Inveritas

unread,
May 7, 2012, 3:03:07 PM5/7/12
to ravendb
Finally it works! Here is the solution if anyone faces same issue:

            Reduce = results => from result in results
                                group result by result.GroupId
                                into g
                                select new
                                {
                                    GroupId = g.Key,
                                    Emails = g.Select(x =>
x.Emails).FirstOrDefault(x => x != null),
                                    Contacts = g.Select(x =>
x.Contacts).FirstOrDefault(x => x != null),
                                    Subject = g.Where(x => x.SendDate !
= null).OrderByDescending(x => x.SendDate).Select(x =>
x.Subject).FirstOrDefault(x => x != null),
                                    IntroText = g.Where(x =>
x.SendDate != null).OrderByDescending(x => x.SendDate).Select(x =>
x.IntroText).FirstOrDefault(x => x != null),
                                    SendDate = g.Where(x =>
x.SendDate != null).OrderByDescending(x => x.SendDate).Select(x =>
x.SendDate).FirstOrDefault(x => x != null)
                                };

/Masod
Reply all
Reply to author
Forward
0 new messages