SQL-запрос к Linq GroupBy и Max - PullRequest
       15

SQL-запрос к Linq GroupBy и Max

1 голос
/ 10 февраля 2010

Вот SQL-запрос, который я пытаюсь преобразовать в Linq. Я использую общий список объектов, а не DataTable, если это актуально.

Select Max(Date), ID, Property1, Peroperty2 From List Group By ID

Пожалуйста, помогите.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2010

Хотя ваш SQL-код недействителен, так как Property1 и Property2 должны быть частью ваших агрегатов, он будет сгруппирован по идентификатору Property1, а затем Property2 в том порядке, который, как я считаю, вы ищете:

from obj in List
group obj by new {obj.ID, obj.Property1, obj.Property2 } into g
select new 
       { 
          ID = g.Key.ID, 
          Property1 = g.Key.Property1, 
          Property2 = g.Key.Property2,  
          MaxDate = g.Max(p => p.Date) 
       }

, что эквивалентно:

Select Max(Date), ID, Property1, Peroperty2 
From List 
Group By ID, Property1, Property2
1 голос
/ 10 февраля 2010

Как сказал Стив, ваш SQL недопустим без Property1 и т. Д. В агрегатном предложении. Однако, мне кажется, что вы пытаетесь получить данные для тех «строк», где дата равна максимальной дате для группы «строк» ​​по Id?

Это работает так:

recs.GroupBy(r => r.Id).SelectMany(g => g.Where(r => r.Date == g.Max(a => a.Date)))

Группирует по Id, получает IEnumeration элементов, дата которых совпадает с максимальной датой для этой группы, и объединяет их в единый IEnumeration - который затем может быть повторен или что угодно.

Редактировать: Кстати, в синтаксисе запросов лучшее, что я могу сделать (заняло у меня некоторое время ...), это что-то вроде:

from r in recs
where r.Date ==
    (from sr in recs
     where sr.Id == r.Id
     select sr.Date).Max()
select r;

Редактировать 2:

Что на самом деле больше похоже на:

recs.Where(r => r.Date == recs.Where(sr => sr.Id == r.Id).Max(a => a.Date)).Select(r => r)

в свободном синтаксисе, который выглядит не так хорошо, как в первый раз, когда я это сделал ... Мне не очень нравится синтаксис выражений запросов, что забавно, потому что я чувствую себя свободно с SQL, и синтаксис запросов предполагается быть более похожим на SQL.

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