У меня запрос из старого приложения, которое я пытаюсь преобразовать в приложение Entity Framework Core.Отношения, с которыми я работаю, просты для многих, когда в одном Ордене может быть много Орденов.Старый запрос выглядит примерно так:
select Order.Id, mostRecent.*
from Order
left join OrderEvent mostRecent
on mostRecent.Id in (select top(1) Id
from OrderEvent
where OrderEvent.OrdId = Order.Id
and OrderEvent.PostDateTime is not null
order by OrderEvent.PostDateTime desc)
where Order.SomeColumn = 'some value'
Я пытаюсь выяснить, как написать этот запрос в LINQ.Не похоже, что можно использовать что-либо кроме equals
при использовании join
, поэтому я сначала попытался сделать что-то вроде:
var test = (from order in _context.Ord.AsNoTracking()
join mostRecentQuery in _context.OrdEvt.AsNoTracking()
on (from orderEvent in _context.OrdEvt.AsNoTracking()
where orderEvent.PostDateTime != null && orderEvent.OrdId == order.Id
orderby orderEvent.PostDateTime descending
select orderEvent.Id).FirstOrDefault()
equals mostRecentQuery.Id
into mostRecentResults
from mostRecent in mostRecentResults.DefaultIfEmpty()
select new
{
OrderId = order.Id,
OrderEvent = mostRecent
}).ToList();
Что бы это ни выглядело, оно кажется таким медленным, что яне могу даже запустить его подключен к Sql Server.Однако я могу выполнить этот запрос при использовании Sqlite, и он генерирует следующий sql:
SELECT 'big list of fields....'
FROM "Ord" AS "order"
LEFT JOIN "OrdEvt" AS "mostRecentQuery" ON COALESCE((
SELECT "orderEvent0"."Id"
FROM "OrdEvt" AS "orderEvent0"
WHERE "orderEvent0"."PostDateTime" IS NOT NULL AND ("orderEvent0"."OrdId" = "order"."Id")
ORDER BY "orderEvent0"."PostDateTime" DESC
LIMIT 1
), X'00000000000000000000000000000000') = "mostRecentQuery"."Id"
Это близко к тому, что я делаю, но я не уверен, почему используется функция COALESCE.
Можно ли представить запрос, который я пытаюсь преобразовать, в синтаксисе запроса Linq?