Каков наилучший способ построить этот запрос LINQ, используя orderby и group by? - PullRequest
0 голосов
/ 06 января 2011

Я изучаю LINQ, и мне потребовалось понять, как получить мои данные так, как я хотел, от mongoDB. Кажется, должен быть лучший способ, чем этот.

Основная предпосылка в коллекции UserMessage, там есть ID, который я пытаюсь сгруппировать. Я хочу заказать по DateCreated в UserMessage.

Было бы также неплохо вернуть COUNT для групп, но я думаю, что готов помочь. :)

//get from the db all the mssages to this user and from
var result = (from messages in session.All<UserMessage>()
              where messages.To == User.Identity.Name ||
                 messages.From == User.Identity.Name
              orderby messages.DateCreated descending
              select messages).ToList().GroupBy(t => t.AssociatedMessageID);
              //.Select(g => new { AssociatedMessageID = g.Key });

var result2 = from m in result.ToList()
              orderby m.First().DateCreated descending
              select m;

List<IGrouping<string,UserMessage>> aryMsg = result2.ToList();

foreach (IGrouping<string,UserMessage> um in aryMsg)
{
    //in this loop assign various members of each UserMessage to a view model
}

1 Ответ

2 голосов
/ 06 января 2011

Нет необходимости иметь столько ToList() преобразований (если только mongoDB не поддерживает группировку). Это ничего не даст, кроме снижения производительности. Второе упорядочение групп не является необходимым, поскольку все сообщения были отсортированы, поэтому группы также должны быть отсортированы. В конечном счете, я думаю, что ваш запрос именно такой:

var aryMsg = (from um in session.All<UserMessage>()
              where um.To == User.Identity.Name
                 || um.From == User.Identity.Name
              orderby um.DateCreated descending)
             .AsEnumerable()
             .GroupBy(um => um.AssociatedMessageID)
             .ToList();
...