LINQ: получение строки с максимальным значением данного атрибута - PullRequest
6 голосов
/ 18 декабря 2009

У меня есть несколько строк, сгруппированных по атрибуту с именем 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

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

Ответы [ 2 ]

15 голосов
/ 18 декабря 2009

Одной из альтернатив будет использование:

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

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

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

0 голосов
/ 18 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...