LINQ: Получение строки с максимальным значением данного атрибута

У меня есть набор строк, сгруппированных на названном атрибуте MyID. Теперь я хочу одну строку от каждой группы где StatusDate атрибут является самым высоким в той одной группе.

Это - то, что я придумал.

rows.Select(x => x.Where(y => y.StatusDate == x.Max(z => z.StatusDate)).First())

С немного большим количеством объяснения:

rows.Select(x => // x is a group
  x.Where(y => // get all rows in that group where...
               // the status date is equal to the largest
               // status date in the group
    y.StatusDate == x.Max(z => z.StatusDate)
  ).First()) // and then get the first one of those rows

Есть ли любой быстрее или больше идиоматического способа сделать это?

6
задан Deniz Dogan 18 December 2009 в 07:54
поделиться

2 ответа

В качестве альтернативы можно использовать:

rows.Select(x => x.OrderByDescending(y => y.StatusDate).First());

... и проверить, знает ли оптимизатор запросов, что ему на самом деле не нужно все сортировать. (Это было бы катастрофой в LINQ to Objects, но вы могли бы использовать MaxBy из MoreLINQ в этом случае :)

(Извинения за предыдущую версию - я не полностью понял группирующий бит.)

15
ответ дан 8 December 2019 в 16:03
поделиться

Не знаю, является ли это Linq to SQL, но если это так, в качестве альтернативы вы можете выполнить с помощью функции rank () в SQL (ранжируйте каждую группу по дате, затем выберите первую ранжированную row из каждого), затем вызовите это как сохраненную процедуру из LINQ. Я думаю, что этот подход становится все более идиоматичным по мере того, как люди достигают границ LINQ2SQL ...

0
ответ дан 8 December 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: