2010-10-03 44 views
14

Resumen: Como llegar arriba 1 elemento en ordenados grupos de datosObtener el primer registro de un grupo en LINQ?

Estoy intentando agrupar por un campo Carid, y luego dentro de cada grupo, que desea ordenar en un campo descendente datetimestamp. Los datos deseados serían para cada automóvil darme el último DateTimeStamp y solo ese 1 en el grupo.

Puedo llegar a este punto, pero tengo problemas para tomar el top 1 del grupo y ordenar el grupo por DateTimeStamp desc.

Aquí es lo que tengo después de la primera operación de grupo:

group 1 
------------------------ 
CarId DateTimeStamp 
1  1/1/2010 
1  1/3/2010 
1  3/4/2010 

group 2 
------------------------ 
CarId DateTimeStamp 
2  10/1/2009 
2  1/3/2010 
2  9/4/2010 

lo que yo deseo sólo la parte superior 1 en un grupo ordenado

group 1 
    ------------------------ 
    CarId DateTimeStamp 
    1  3/4/2010 

    group 2 
    ------------------------ 
    CarId DateTimeStamp 
    2  9/4/2010 

Brickwall: Dónde Me detengo, necesito el CarId y DateTimeStamp en la cláusula group by para ordenar más adelante por DateTimeStamp. Tal vez la clasificación de la fecha se debe hacer en una función separada, no estoy seguro.

Respuesta

16
data 
    .GroupBy(
     x => x.CardId, 
     (x, y) => new { 
      Key = x, 
      Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault() 
     } 
    ); 

este grupo todos los elementos por CardId, después ordena los elementos de cada grupo por DateTimeStamp (descendente), a continuación, recortar cada grupo que sólo contienen el primer elemento. Finalmente, devuelve un enumerable de "grupos" (con las comillas de susto ya que en realidad son un tipo anónimo en lugar de un IGrouping) donde cada grupo tiene el elemento que está buscando.

+5

¡Eso lo hizo! Obtuve una excepción y tuve que usar FirstOrDefault() en lugar de First(). ¡Gracias! – RyBolt

+0

+1: Perfecto. Justo lo que necesitaba (una versión de agrupación y primer registro que realmente puedo seguir :) –

+0

gracias, estaba buscando esto, busqué 'grupo sql por último registro' pero no encontré solución' grupo linq por último registro' Ayudó a venir aquí, solo necesito, tengo que hacerlo 'mecanografiado' para 'ViewModel' – stom

0

¿Pruebas esto?

var latest = Group1.OrderByDescending(x=>x.DateTimeStamp).FirstOrDefault(); 
+0

¿No será simplemente devolver el primer grupo * *? ¿No es el primer elemento en cada grupo? –

+0

@Kirk: Sí, parece que el OP los tiene en grupos separados, ya que cada 'conjunto de resultados' tiene encabezados y datos de resultados separados. Mi respuesta tiene 'Group1' para resaltar cómo se puede hacer con ambos grupos. –

+0

¿Cómo se define su Grupo1, contiene Id y DateTimeStamp? – RyBolt

2

puedo encontrar la sintaxis de expresión de consulta más fácil de entender a mí mismo:

from x in data 
group x by x.CarId into grp 
select new { 
    CarId = x.CarId, 
    Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault() 
}; 
Cuestiones relacionadas