У меня есть два класса: Property и PropertyValue. Свойство имеет несколько значений, где каждое значение является новой ревизией.
При получении набора свойств я хочу включить самую последнюю версию значения для каждого свойства.
в T-SQL это очень эффективно можно сделать так:
SELECT
p.Id,
pv1.StringValue,
pv1.Revision
FROM dbo.PropertyValues pv1
LEFT JOIN dbo.PropertyValues pv2 ON pv1.Property_Id = pv2.Property_Id AND pv1.Revision < pv2.Revision
JOIN dbo.Properties p ON p.Id = pv1.Property_Id
WHERE pv2.Id IS NULL
ORDER BY p.Id
"Волшебство" в этом запросе состоит в том, чтобы присоединиться к условию меньше условия и искать строки без результата, вызванного LEFT JOIN.
Как я могу сделать что-то подобное, используя LINQ to EF?
Лучшее, что я мог придумать, было:
from pv in context.PropertyValues
group pv by pv.Property into g
select g.OrderByDescending(p => p.Revision).FirstOrDefault()
Это дает правильный результат, но примерно в 10 раз медленнее, чем другие.