Упорядочить по убыванию группы по дате Max, затем упорядочить по одной строке в группе по возрастанию, используя метод синтаксиса linq - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть такая таблица

Id      Date       GroupId   Text    Column1   Column2 ...
1    2020-02-02       1      ....     ....       ...
2    2020-02-04       1      ....     ....       ...
3    2020-02-03       1      ....     ....       ...
4    2020-02-02       2      ....     ....       ...
5    2020-02-05       2      ....     ....       ...

Мне нужно получить этот результат:

Id      Date       GroupId   Text    Column1   Column2 ...
5    2020-02-05       2      ....     ....       ...
4    2020-02-02       2      ....     ....       ...
1    2020-02-02       1      ....     ....       ...
3    2020-02-03       1      ....     ....       ...
2    2020-02-04       1      ....     ....       ...

Я объясняю, что мне нужно получить перед всеми строками группы 2, потому что максимум дата находится в группе 2 ... Мне нужно упорядочить группу по убыванию даты, но каждую отдельную группу следует упорядочить по возрастанию даты.

Мне также сложно написать ее в sql. Кто-нибудь может мне помочь? Спасибо

РЕДАКТИРОВАТЬ: Вот что я пытался сделать:

var result = messages.Select(m => new MyViewModel()
            {
                Id = m.Id,
                Date = m.Date,
                Text = m.Text,                    
                GroupId = m.GroupId
            }).GroupBy(d => d.GroupId)
              .SelectMany(g => g)
              .OrderByDescending(x => x.GroupId)
              .ThenBy(x => x.Date);

Но это не работает

Ответы [ 4 ]

1 голос
/ 04 февраля 2020

Я предлагаю создать промежуточный результат со свойством GroupDate. В моем примере я использую C# 7.0 Tuples . Вы также можете использовать анонимные типы, если вы используете более старую версию C#.

var result = messages
    .GroupBy(m => m.GroupId)                                // Create Tuple ...
    .Select(g => (Group: g, GroupDate: g.Max(m => m.Date))) // ... with group and group date.
    .SelectMany(a =>              // Expand the group
        a.Group.Select(m =>       // Create new tuple with group date and model.
            (a.GroupDate,
             Model: new MyViewModel() {
                 Id = m.Id,
                 Date = m.Date,
                 Text = m.Text,
                 GroupId = m.GroupId
             })))
    .OrderByDescending(x => x.GroupDate)
    .ThenBy(x => x.Model.Date)
    .Select(x => x.Model);         // Extract the view model from the tuple.

Результат:

Id = 2, дата = 2020-02-02 , Идентификатор группы = 2
идентификатор = 2, дата = 2020-02-05, идентификатор группы = 2
идентификатор = 1, дата = 2020-02-02, идентификатор группы = 1
идентификатор = 1, дата = 2020 -02-03, идентификатор группы = 1
идентификатор = 1, дата = 2020-02-04, идентификатор группы = 1

Пример для кортежа:

var t = (X: 15, Name: "axis");
Print($"X = {t.X}, Name = {t.Name}");

Имя свойства кортежа также можно вывести, как в (a.GroupDate, Model: ...). Первое свойство будет автоматически называться GroupDate. Второй назван явно Model.

0 голосов
/ 04 февраля 2020

Если вы хотите использовать linq, посмотрите это.

YourList.OrderByDescending(x=>x.GroupId).ThenBy(x=>x.Date))
0 голосов
/ 04 февраля 2020

Вы хотите упорядочить группы по их максимальной дате. Затем в каждой группе упорядочите по убыванию даты.

Я бы порекомендовал эти ключи для максимальной даты order by:

  1. для каждой группы (des c)
  2. groupId, чтобы сохранить каждую группу вместе (порядок не имеет значения)
  3. флаг, чтобы поставить максимальную общую дату первой
  4. дата для всех других строк (как c)

Итак:

order by max(date) over (partition by groupId) desc, 
         groupId,   -- put each group together
         (case when date = max(date) over() then 1 else 2 end),
         date
0 голосов
/ 04 февраля 2020

В SQL вы можете использовать оконные функции:

order by 
    max(date) over(partition by groupId),
    case when max(date) over(partition by groupId) = max(date) over() then date end desc,
    date
...