LINQ - как отсортировать по дате

1

У меня есть следующая таблица (Записи):

RecordID int,
Nickname nvarchar(max),
DateAdded datetime

Мне нужна группа по максимальному количеству записей для Nickname. Я сделал это:

        var users = (from i in db.Records
                     where i.Form.CompetitionID == cID
                     group i by i.Nickname into g
                     orderby g.Count() descending
                     select new TopUserModel()
                     {
                         Nickname = g.Key,
                         Position = g.Count()
                     }).Take(100).ToList();

оно работает

Прямо сейчас мне нужно отсортировать его по дате (кто первым получил максимальные записи). У меня должен быть такой запрос:

select Nickname, Count(*) as Result, MAX(DateAdded) as MDate from Records group by Nickname order by Result Desc, MDate Asc

Как это сделать с помощью LINQ?

Теги:
linq

5 ответов

3
Лучший ответ

Я думаю, это то, что вы хотите. Я использовал расширенную версию Linq, которая, вероятно, проще. Идея состоит в том, чтобы вычислить MaxCount и MaxDate после GroupBy, чтобы вы могли использовать его в следующих предложениях OrderBy.

db.Records
.Where(i => i.Form.CompetitionID == cID)
.GroupBy(i => i.Nickname)
.Select(g => new { MaxCount = g.Count(), MaxDate = g.Max(i => i.DateAdded), Nickname = g.Key})
.OrderByDescending(gx => gx.MaxCount)
.ThenByDescending(gx => gx.MaxDate)
.Select(gx => new TopUserModel()
{
     Nickname = gx.Nickname,
     Position = gx.MaxCount
}).Take(100).ToList();
  • 0
    еще одно исправление - должно быть ThenBy (gx => gx.MaxDate) вместо .ThenByDescending (gx => gx.MaxDate)
1

Я думаю, что вы просите:

...
select new TopUserModel()
{
    Nickname = g.Key,
    Position = g.Count()
    Date = g.Max(r => r.DateAdded)
}).Take(100).OrderByDescending(t => t.Position).ThenBy(t => t.Date).ToList();

Когда вы используете group клавиша - это ваша группировка, но перечисляемая - это все записи, которые вы сгруппировали, чтобы вы могли использовать на них агрегатные функции.

Если вы хотите сортировать по нескольким столбцам, вы можете привести их в порядок, используя цепочку выше.

  • 2
    Поскольку вопрос гласит, что результат должен быть отсортирован, вы должны добавить логику для сортировки на основе свойства Date
  • 1
    Обновлено, спасибо.
Показать ещё 2 комментария
0
    var users = (from i in db.Records
                         where i.Form.CompetitionID == cID
                         group i by new {i.Nickname} into g
                         orderby g.Count() descending, 
                         select new TopUserModel()
    {
        Nickname = g.Key,
        Position = g.Count()
        Date = g.Max(r => r.DateAdded)
    }).Take(100

).OrderBy(c => c.Date).ToList();
  • 0
    Когда я добавил ответ, ответ @Tristan Warner-Smith не содержал порядок по дате. иначе я бы не добавил ответ
0

Просто добавьте максимальную дату для псевдонима для заказа. Вы также можете ввести новую переменную диапазона для позиции:

var users = (from r in db.Records
             where r.Form.CompetitionID == cID
             group r by r.Nickname into g
             let position = g.Count()
             orderby position descending, g.Max(r => r.DateAdded)
             select new TopUserModel {
                 Nickname = g.Key,
                 Position = position
             }).Take(100).ToList();
-2

Вопрос уже здесь ответил: OrderBy поле даты с linq и возвращает ToList()

Добавить в конце вашего заявления пользователя

    .OrderBy(e => e.Date).ToList();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню