2009-06-10 3 views
0

У меня есть объект, который содержит эти три свойства: ID, DATE и NAME и хочет запросить его с помощью linq, давая те же результаты, что и в написанном в инструкции sql ниже.Linq group by с дополнительным запросом

SELECT ID, MAX(DATE), NAME 
FROM TABLE 
GROUP BY ID 

Вот то, что я до сих пор с LINQ:

var grouped = from a in table 
group a by a.ID into g 
select new fooObject() 
{ 
DATE= g.Max(a => a.DATE), 
NAME= g.Select(a => a.Name).ToString(), 
ID= g.Select(a => a.ID) 
}; 

Заранее спасибо за любую помощь.

ответ

1
SELECT ID, MAX(DATE), NAME 
FROM TABLE 
GROUP BY ID 

Колонка «TABLE.NAME» недопустим в списке выбора, поскольку он не содержится ни в статистической функции или предложения GROUP BY.

+0

Похоже, мне нужен другой подход, возможно, дополнительный запрос? Мне нужны записи, сгруппированные по ID и MAX (DATE). – 2009-06-10 17:15:21

+0

Вы можете попробовать: MAX (Name) –

2
var grouped = (from a in table 
       where a.Date == (from d in table where a.ID == d.ID select Date).Max() 
       select a).OrderBy(i => i.ID); 
4

Учитывая ваше обновленное объяснение, вот мое предлагаемое решение. Я также немного очистил код.

var grouped = from item in table 
       group item by item.Id into g 
       let itemMaxDate = g.MaxBy(i => i.Date) 
       select new FooObject() 
       { 
        Id = g.Key, 
        Name = itemMaxDate.Name, 
        Date = itemMaxDate.Date 
       }; 

Затем вам необходимо определить способ расширения MaxBy. (К сожалению, LINQ действительно включает один встроенный.)

public static TSource MaxBy<TSource, TResult>(this IEnumerable<TSource> 
    collection, Func<TSource, TResult> func) 
{ 
    var comparer = Comparer<TResult>.Default; 
    TSource maxItem = null; 
    foreach (var item in collection) 
    { 
     if (comparer.Compare(item, maxItem) > 0) 
      maxItem = item; 
    } 
    return maxItem; 
} 

Я считаю, что это должно быть то, что вы хотите прямо сейчас. Дайте мне знать, если это поможет вам.

+0

«group item by item.ID в группу» должно быть «group item by item.ID в g» –

+0

Я не хочу группироваться в NAME. Данные будут выглядеть следующим образом. Я хочу сгруппировать идентификаторы и взять строку с максимальной датой и любым именем. ID ДАТА ИМЯ 1 1/1/09 SMH 1 1/2/09 ASD 2 1/3/09 FGH 2 1/4/09 JKL Результат будет ID ДАТА ИМЯ 1 1/2/09 ASD 2 1/4/09 JKL – 2009-06-10 17:05:53

+0

Ну, это не сработало для описания данных. – 2009-06-10 17:06:24