#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. В чем проблема? Сделайте это. Этот запрос полностью встраивается.