LINQ:按聚合分组但仍然从最近一行获取信息?

假设我有一张包含运输历史的表格。 我想编写一个查询来计算每个用户的发货量,并从该表中该用户的最新条目中获取发货名称。

表结构简单:ShipmentID MemberID ShippingName ShippingDate

如何编写LINQ C#查询来执行此操作?

听起来可能想要这样的东西:

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

不是LINQ的答案,但就个人而言 ,我会为此而放弃SQL,以确保它没有做任何N + 1等; 例如:

 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 

你可以做LINQ之类的(未经测试):

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