2010-05-03 21 views
7

Ho una semplice tabella di LINQ to Enities per interrogare e ottenere i record più recenti con data campoSelezionare i più recenti record utilizzando LINQ to Entities

Così ho provato questo codice:

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.

C'è un altro modo per farlo? Grazie mille!

+0

Il raggruppamento in base a un DateTime non ha senso. Se la risoluzione fosse, ad esempio, millisecondi, è improbabile che un gruppo contenga più di un elemento. O è davvero un campo Data? –

risposta

0

Quindi la risposta è:

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) 
      }; 

Ciò restituirà i record più recenti.

+0

Ciò restituirà un nuovo oggetto {Key, Data} c'è un modo per tornare stessi oggetti "alert"? – Begemotya

+0

sono bloccato sul vostro commento qui. Nei miei test ho' m anche ottenendo {Key, Data} ma hai segnato questo come deliberato. come si fa a ottenere gli oggetti di allarme? – Jacques

4

Se non c'è un motivo per gruppo, si potrebbe semplicemente cambiare la query un po ':

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

Questo caricherà l'intero database in memoria quando richiesto ... –

+0

@BlueRaja - in realtà non farà nulla. Finché non si fa qualcosa con latestAlerts come .First() o .Take (10) non si verificherà alcun hit del database. –

+2

@hightechrider: Quindi il "quando interrogato" ... Presumibilmente, il poster stava cercando una risposta completa. –

0

Dovrebbe essere

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

GroupBy è sicuramente supportato da LINQ-to -Entities

+0

non funziona, "l'ordine da g.key" è "rosso" -> "un corpo di query deve terminare con select clausola o una clausola gruppo – Begemotya

+0

Qualsiasi modo ho bisogno di gruppo da 2 campi 'UpdateDateTime' e 'Id' in per vedere la scheda più recente per ogni id – Begemotya

8

Ho avuto un bisogno similare. Voglio recuperare il record digitato, non un nuovo oggetto anonimo. Per farlo. Primo() può aiutare.

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

Utilizzare OrderByDescending per ordinarli e prendere quello in alto con First(). Li hai raggruppati in base al tuo identificatore, quindi dovresti ottenere solo il record più recente per ogni identificatore.

+1

dovuto usare FirstOrDefault(), ma funzionava benissimo con quello. – Joshua

Problemi correlati