2010-05-03 23 views
7

tengo un simple LINQ a Enities tabla para consultar y obtener los registros más recientes utilizando el campo Fechaseleccionar registros más recientes utilizando LINQ a Entidades

Así que probamos este código:

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.

¿Hay alguna otra forma de hacerlo? ¡Muchas gracias!

+0

Agrupar por un DateTime no tiene sentido. Si la resolución fue, por ejemplo, milisegundos, es poco probable que tenga un grupo con más de un elemento. ¿O es realmente un campo de Fecha? –

Respuesta

0

Así que la respuesta es:

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

Esto devolverá los registros más recientes.

+0

Esto devolverá un nuevo objeto {Key, Date} ¿Hay alguna manera de devolver los mismos objetos de "alerta"? – Begemotya

+0

Estoy atascado en su comentario aquí. En mis pruebas, ' m también obtengo {Key, Date} pero ha marcado esto como resuelto. ¿Cómo se obtienen los objetos de alerta? – Jacques

4

Si no hay una razón para que el grupo, que sólo podría cambiar su consulta un poco:

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

Esto cargará toda la base de datos en la memoria cuando se lo pregunte ... –

+0

@BlueRaja - en realidad no hará nada. Hasta que no haga algo con las últimas alertas como .First() o .Take (10), no se producirá ningún golpe de la base de datos. –

+2

@hightechrider: De ahí el "cuando se le preguntó" ... Presumiblemente, el póster estaba buscando una respuesta completa. –

0

Debe ser

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

GroupBy es, sin duda el apoyo de LINQ to -entidades

+0

no funciona, el "orden por g.key" es "rojo" -> "un cuerpo de consulta debe terminar con una cláusula de selección o una cláusula de grupo – Begemotya

+0

Cualquier forma que necesite agrupar por 2 campos" UpdateDateTime "e" Id "en para obtener el registro más reciente para cada identificación – Begemotya

8

He tenido una necesidad similar. Quiero recuperar el registro mecanografiado, no un nuevo objeto anónimo. Para hacer eso. Primero() puede ayudar.

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

Utilice el OrderByDescending para encargarlas y tome la superior con First(). Los ha agrupado por su identificador por lo que solo debe obtener el registro más nuevo para cada identificador.

+1

Tuve que usar FirstOrDefault(), pero funcionó muy bien con eso. – Joshua

Cuestiones relacionadas