Подтвердить что ты не робот

Получить первую запись группы в LINQ?

Резюме: как получить верхний 1 элемент в упорядоченных группах данных

Я пытаюсь группировать по полю CarId, а затем в каждой группе я хочу сортировать по дате в поле DateTimeStamp. Желательные данные будут для каждого автомобиля, дайте мне последний DateTimeStamp и только 1 в группе.

Я могу дойти до этой точки, но у меня проблемы с получением первого места группы и упорядочением группы по дате DateTimeStamp.

Вот что я получил после первой групповой операции:

group 1
------------------------
CarId  DateTimeStamp 
1      1/1/2010
1      1/3/2010
1      3/4/2010

group 2
------------------------
CarId  DateTimeStamp 
2      10/1/2009
2      1/3/2010
2      9/4/2010

что я хотел бы получить только верхнюю часть 1 в упорядоченной группе

    group 1
    ------------------------
    CarId  DateTimeStamp 
    1      3/4/2010

    group 2
    ------------------------
    CarId  DateTimeStamp 
    2      9/4/2010

Brickwall:. Когда я останавливаюсь, в предложении group by требуется значение CarId и DateTimeStamp, чтобы впоследствии сортировать DateTimeStamp. Возможно, сортировка даты должна выполняться в отдельной функции, не уверен.

4b9b3361

Ответ 1

data
    .GroupBy(
        x => x.CardId, 
        (x, y) => new { 
            Key = x, 
            Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault() 
        }
    );

Это сгруппирует все элементы с помощью CardId, а затем упорядочивает элементы каждой группы на DateTimeStamp (убывает), затем парирует каждую группу, чтобы содержать только первый элемент. Наконец, он возвращает перечислимые "группы" (с кавычками, поскольку они на самом деле являются анонимным типом вместо IGrouping), где каждая группа имеет один элемент, который вы ищете.

Ответ 2

Я нашел синтаксис выражения запроса проще для себя:

from x in data 
group x by x.CarId into grp
select new {
    CarId = x.CarId,
    Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault()
};

Ответ 3

Попробуй?

 var latest = Group1.OrderByDescending(x=>x.DateTimeStamp).FirstOrDefault();