У меня есть веб-приложение с двумя таблицами для отслеживания пользовательских ресурсов.Акции должны быть одобрены, и поэтому они проходят серию изменений статуса.Каждое изменение статуса записывается в журнал и ставится метка времени.Текущий статус всегда является последней записью в журнале для этого конкретного ресурса.
Вот сущности (с краткостью):
Shares: ShareID Имя пользователя
ShareLogs: LogIDShareID CreatedDate Status
Я пытаюсь получить список Акций с их текущим статусом на основе последней записи в журнале.Вот запрос SQL, который возвращает правильный результат, но я хотел бы сделать это с помощью LINQ.
SELECT s.ShareID, s.UserName, sl.Code, sl.CreatedDate
FROM Shares s
INNER JOIN
(
SELECT s.ShareID, s.Code, s.CreatedDate
FROM ShareLogs sl
INNER JOIN (SELECT ShareID, MAX(CreatedDate) logDate FROM ShareLogs GROUP BY ShareID) sl2
ON sl.ShareID = sl2.ShareID AND sl.CreatedDate = sl2.logDate) psl1
ON s.ShareID = sl1.ShareID
ORDER BY s.ShareID
Я написал один запрос LINQ, который, кажется, работает, но я чувствую, что должен бытьлучше, так как этот запрос выглядит довольно ужасно.
var query = from list in
(from s in context.Shares
join sl in context.ShareLogs on s.ShareID equals sl.ShareID
where sl.CreatedDate == s.ShareLogs.Max(e => e.CreatedDate)
select new
{
share = s
status = sl.Code,
processDate = sl.CreatedDate
}).Where(e => e.status == 2 || e.status == 3)
select list;