2013-10-05 3 views
0

Рассмотрим следующее заявление LINQ:Как получить максимальное количество каждой группы?

var posts = db.Posts 
    .Where(p => p.Votes.Count > 0 && p.User.Confirmed) 
    .Select(p => new 
    { 
     PostId = p.PostId, 
     Votes = p.Votes.Count(), 
     Hours = EntityFunctions.DiffHours(DateTime.UtcNow, p.Timestamp) 
    }) 
    .Select(p1 => new 
    { 
     PostId = p1.PostId, 
     Votes = p1.Votes, 
     Group = p1.Hours <= 24 ? 24 : 
      p1.Hours <= 168 ? 168 : 
      p1.Hours <= 720 ? 720 : 0 
    }) 
    .Where(p2 => p2.Group != 0); 

Он успешно группы перечисление должностей в соответствующих группах: 24 часов, 168 часов и 720 часов.

Однако, теперь мне нужно получить PostId, у которого есть MaxVotes для каждой группы. Как мне это сделать?

ответ

2
var postIds = posts.OrderByDescending(x => x.PostId).GroupBy(x => x.Group) 
        .Select(x => x.First().PostId); 

Или, для немного больше ясности (ИМХО), и (я думаю) меньше скорость:

var postIds = posts.GroupBy(x => x.Group).Select(g => g.Max(p => p.PostId)); 

Бывший имеет то преимущество, что если вы хотите пост, а не только PostId , у вас есть, что доступно более легко.

+0

Я вижу, где я перепутал свой вопрос. Прости. Мне нужна почта с 'Max'' Votes' для каждой группы. –

1

Я смотрел на это, но вроде медленно. Это немного другой синтаксис, поэтому я все равно отправлю его

var groups = (from p in posts 
       group p by p.Group into g 
       select new 
       { 
        Id = g.Max(p => p.Id), 
        Group = g.Key 
       }).ToList(); 


var bestPosts = (from p in posts 
       join j in groups on new {p.Group, p.Votes} equals new {j.Group, j.Votes} 
       select p).ToList(); 
+0

Я вижу, где я перепутал свой вопрос. Прости. Мне нужна должность с Max Votes для каждой группы. –

+0

Отредактировано для получения сообщений с лучшим голосованием. Я думаю, вы могли бы иметь связи, хотя. –

Смежные вопросы