Синтаксис запроса LINQ: группировать по порядку и занимать одну строку

#linq #group-by

#linq #групповое-по

Вопрос:

Следующий запрос сгруппирует записи в таблице заданий, добавленные в течение данного дня, по лицу, которому оказывалась помощь, и по времени выполнения.

 (from l in Assignments where ((DateTime)l.AddedLocalTime).Date == TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date
group l by new {l.FkAssistedBy, l.CompletedTime} into groups
orderby  groups.Key.CompletedTime descending
select new { user = groups.Key.FkAssistedBy, groups.Key.CompletedTime })
                                            
 

Здесь, если конкретный пользователь выполнил несколько назначений в течение дня, на каждого пользователя будет приходиться несколько записей. Но то, что я хочу, — это сгруппировать по пользователю и получить ТОЛЬКО последнюю завершенную запись для каждого пользователя. Как мне использовать Take(1) или First() в приведенном выше запросе, чтобы получить желаемый результат? Мне нужно вывести поля assistedBy и completedTime.

Комментарии:

1. Это LINQ для объектов?

2. @SvyatoslavDanyliv да

Ответ №1:

Этот запрос должен работать с LINQ to Objects:

 (
    from l in Assignments 
    where ((DateTime)l.AddedLocalTime).Date == TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date
    group l by new { l.FkAssistedBy } into g
    select new 
    {
        user = g.Key.FkAssistedBy,
        CompletedRecord = g.OrderbyDescending(x = c.CompletedTime).FirstOrDefault()
    }
)
 

Комментарии:

1. Извините, я должен был прояснить. Это подзапрос более крупного запроса, из которого мне нужно, чтобы FkAssistedBy и CompletedTime были спроецированы для соединения с внешним запросом.

2. В чем проблема? Сделайте это. Этот запрос полностью встраивается.