Я считаю, что это сгенерирует искомый SQL (плюс или минус вложенный подзапрос):
var ans = from c in Conversation
join m in Message on c.Id equals m.ConversationId into mj
from m in mj.DefaultIfEmpty()
group m by c.Id into mg
orderby mg.Max(m => m.DateCreated) descending
select mg.Key;
Однако в LINQ вы можете использовать групповое объединение вместо обычного объединения.Это также должно делать то, что вы хотите, но использует подвыбор в SQL, поэтому я не уверен, что более эффективно на сервере.Общая мудрость кажется, что присоединение было лучше, но следование за группой может сделать его спорным, как и достаточно современный оптимизатор.В другом сообщении, которое я нашел, говорилось, что подзапрос (CIS) был намного более эффективным, так что это может быть лучше.
var ans2 = from c in Conversation
join m in Message on c.Id equals m.ConversationId into mj
orderby mj.Max(m => m.DateCreated) descending
select c.Id;