2016-08-11 2 views
4

Я искал способ получить несколько столбцов, но группа только одна в SQL, и я нашел некоторую информацию. Однако я не могу придумать способ сделать это в linq.Выделить все столбцы, но группировать только по одному в linq

У меня есть следующий игрушка пример таблицы:

| Id | Message | GroupId | Date | 
|-------------------------------| 
| 1 | Hello | 1  | 1:00 | 
| 2 | Hello | 1  | 1:01 | 
| 3 | Hey  | 2  | 2:00 | 
| 4 | Dude | 3  | 3:00 | 
| 5 | Dude | 3  | 3:01 | 

И я хотел бы, чтобы восстановить все столбцы для строк, которые имеют ярко выраженный GroupId следующим образом (с «Дата» порядок по убыванию):

| Id | Message | GroupId | Date | 
|-------------------------------| 
| 1 | Hello | 1  | 1:00 | 
| 3 | Hey  | 2  | 2:00 | 
| 4 | Dude | 3  | 3:00 | 

Меня не волнует, какая строка выбрана из сгруппированных (первая, вторая ...), пока это единственная, указанная в группе Id.

Я вышел со следующим кодом до сих пор, но он не делает то, что должен:

List<XXX> messages = <MyRep>.Get(<MyWhere>) 
          .GroupBy(x => x.GroupId) 
          .Select(grp => grp.OrderBy(x => x.Date)) 
          .OrderBy(y => y.First().Date) 
          .SelectMany(y => y).ToList(); 

ответ

8

Это даст вам один элемент в каждой группе:

List<dynamic> data = new List<dynamic> 
{ 
    new {ID = 1, Message = "Hello", GroupId = 1, Date = DateTime.Now}, 
    new {ID = 2, Message = "Hello", GroupId = 1, Date = DateTime.Now}, 
    new {ID = 3, Message = "Hey", GroupId = 2, Date = DateTime.Now}, 
    new {ID = 4, Message = "Dude", GroupId = 3, Date = DateTime.Now}, 
    new {ID = 5, Message = "Dude", GroupId = 3, Date = DateTime.Now}, 
}; 

var result = data.GroupBy(item => item.GroupId) 
       .Select(grouping => grouping.FirstOrDefault()) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 

//Or you can also do like this: 
var result = data.GroupBy(item => item.GroupId) 
       .SelectMany(grouping => grouping.Take(1)) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 

Если вы хотите контролировать OrderBy затем:

var result = data.GroupBy(item => item.GroupId) 
       .SelectMany(grouping => grouping.OrderBy(item => item.Date).Take(1)) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 
+0

Обратите внимание, что 'FirstOrDefault' может быть заменяет' First' поскольку группа гуа ranteed иметь как минимум 1 вещь. –

+0

@ Gilad Похоже, я был слишком расстроен ... Вы не только решаете мою проблему, но и предоставляете некоторое понимание с помощью этих примеров! Спасибо – Tekerson

+0

@Tekerson - вы очень желанны :) Возможно, также посмотрите в [SO Documentation for linq] (http://stackoverflow.com/documentation/c%23/68/linq-queries#t=201608111109444847305) - Там хорошие разделы о 'Take'' SelectMany',' OrderBy' - от него можно многому научиться :) –

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