LINQ: группировать по совокупности, но все равно получать информацию из самой последней строки?

#c# #linq

#c# #linq

Вопрос:

Допустим, у меня есть таблица, в которой хранится история доставки. Я хотел бы написать запрос, который подсчитывает количество отправлений для каждого пользователя и получает название доставки из самой последней записи в таблице для этого пользователя.

Структура таблицы для простоты: ShipmentID MemberID ShippingName ShippingDate

Как мне написать запрос LINQ C # для этого?

Комментарии:

1. «для каждого пользователя» вы имеете в виду MemberID? «самая последняя запись» -> Дата отправки?

Ответ №1:

Похоже, может потребоваться что-то вроде:

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

Ответ №2:

На самом деле это не ответ 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
           };