2010-05-03 2 views
7

У меня есть простой Linq к Enities таблицы для запроса и получить самые последние записи, используя поле датыВыберите самые последние записи с помощью LINQ к Entities

Так что я попробовал этот код:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable<Alert> latestAlerts = 
    from a in alerts 
    group a by a.UpdateDateTime into g 
    select g.OrderBy(a => a.Identifier).First(); 

Error: NotSupportedException: The method 'GroupBy' is not supported.

Есть ли другой способ сделать это? Спасибо большое!

+0

Группировка по дате времени не имеет смысла. Если бы разрешение было, скажем, миллисекундами, у вас вряд ли была бы группа с более чем одним элементом. Или это действительно поле даты? –

ответ

0

Так что ответ:

var query = 
    from alert in m_alerts 
    group alert by alert.Identifier 
      into g 
      select new 
      { 
     GroupIdentifier = g.Key, 
     UpdateDateTime = g.Max(p => p.UpdateDateTime) 
      }; 

Это вернет самые последние записи.

+0

Это вернет новый объект {Key, Date} Есть ли способ вернуть те же объекты «оповещения»? – Begemotya

+0

Я застрял на вашем комментарии здесь. m также получает {Key, Date}, но вы отметили это как разрешенное. Как вы получаете объекты оповещения? – Jacques

4

Если нет оснований для группы это, можно просто переключить запрос вверх немного:

IQueryable<Alert> alerts = GetAlerts(); 
IQueryable latestAlerts = alerts.OrderByDescending(a => a.UpdateDateTime); 
+3

Это будет загружать всю базу данных в память при запросе ... –

+0

@BlueRaja - на самом деле ничего не будет. Пока вы не сделаете что-то с lastAlerts, например .First() или .Take (10), никакого попадания в базу данных не произойдет. –

+2

@hightechrider: Следовательно, «когда спросили» ... Предположительно, плакат искал полный ответ. –

0

Это должно быть

IQueryable<Alert> latestAlerts = 
    (from a in alerts 
    group a by a.UpdateDateTime into g 
    order by g.Key 
    select g).First(); 

GroupBy определенно поддерживается Linq к -Entities

+0

он не работает, «order by g.key» «красный» -> «тело запроса должно заканчиваться предложением select или предложением группы – Begemotya

+0

В любом случае мне нужно группировать по 2 поля« UpdateDateTime »и« Id »в чтобы получить самую последнюю запись для каждого id – Begemotya

8

У меня была подобная необходимость. Я хочу вернуть напечатанную запись, а не новый анонимный объект. Для этого может помочь First().

var query = from alert in m_alerts 
     group alert by alert.Identifier into a 
     select a.OrderByDescending(g => g.UpdateDateTime).First(); 

Используйте OrderByDescending чтобы заказать их и взять верхнюю часть с помощью First(). Вы сгруппировали их по своему идентификатору, чтобы получить только самую новую запись для каждого идентификатора.

+1

Придется использовать FirstOrDefault(), но отлично справился с этим. – Joshua

Смежные вопросы