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