У меня есть следующая таблица (Записи):
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, которая, вероятно, проще. Идея состоит в том, чтобы вычислить 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();
Я думаю, что вы просите:
...
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
клавиша - это ваша группировка, но перечисляемая - это все записи, которые вы сгруппировали, чтобы вы могли использовать на них агрегатные функции.
Если вы хотите сортировать по нескольким столбцам, вы можете привести их в порядок, используя цепочку выше.
Date
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();
Просто добавьте максимальную дату для псевдонима для заказа. Вы также можете ввести новую переменную диапазона для позиции:
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();
Вопрос уже здесь ответил: OrderBy поле даты с linq и возвращает ToList()
Добавить в конце вашего заявления пользователя
.OrderBy(e => e.Date).ToList();