2011-10-04 6 views
6

Digamos que tengo una tabla que contiene el historial de envíos. Me gustaría escribir una consulta que cuente la cantidad de envíos por usuario y obtenga el nombre de envío de la entrada más reciente en la tabla para ese usuario.LINQ: Agrupe por agregado pero aún así obtenga información de la fila más reciente?

Estructura de tabla para la simplicidad: ShipmentID MemberID ShippingName ShippingDate

¿Cómo se escribe una consulta LINQ # C para hacer esto?

+0

"por usuario", que significa u memberID? "entrada más reciente" -> fecha de envío? – Boomer

+0

@Boomer Sí en ambos – Nate

Respuesta

5

Suena como puede ser que desee algo como:

var query = from shipment in context.ShippingHistory 
      group shipment by shipment.MemberID into g 
      select new { Count = g.Count(), 
        MemberID = g.Key, 
        MostRecentName = g.OrderByDescending(x => x.ShipmentDate) 
             .First() 
             .ShipmentName }; 
0
No

realmente una respuesta LINQ, pero personalmente, estaría cayendo a SQL para que, para asegurarse de que no está haciendo cualquier N +1, etc. por ejemplo:

select s1.MemberID, COUNT(1) as [Count], 
    (select top 1 ShippingName from Shipping s2 where s2.MemberID = s1.MemberID 
    order by s2.ShippingDate desc) as [LastShippingName] 
from Shipping s1 
group by s1.MemberID 

Probablemente puede hacer algo como LINQ (no probado):

var qry = from row in data 
      group row by row.MemberId into grp 
      select new { 
       MemberId = grp.Key, 
       Count = grp.Count(), 
       LastShippingName = 
       grp.OrderByDescending(x => x.ShippingDate).First().ShippingName 
      }; 
Cuestiones relacionadas