У меня есть две сущности, предположим, что они называются Контейнер и Запись. У них есть отношения master-child: «контейнер» может содержать много записей.
Таблица записей в базе данных имеет следующие столбцы:
- Id
- Дата
- Container_Id
- RecordType_Id
У сущности Record нет навигационных свойств, которые бы ссылались на Контейнер.
Я пишу запрос LINQ для моего репозитория, который будет извлекать ТОЛЬКО записи для контейнера, у которого самая последняя дата для каждого RecordType_Id. Все старые записи следует игнорировать.
Так, если в контейнере есть, скажем, 5 записей, по одной на каждый RecordType_Id, с датой 24 мая 2011 года. Но также есть еще 5 записей для каждого RecordType_Id, но с датой 20 мая 2011 года. Тогда только первые 5 с датой 24 мая будут получены и добавлены в коллекцию в контейнере.
Я придумал SQL-запрос, который делает то, что мне нужно (но, может быть, есть более эффективный способ?):
select t.*
from Records t
inner join (
select Container_Id, RecordType_Id, max(Date) AS MaxDate
from Records
group by Container_Id, RecordType_Id ) g
on t.Date = g.MaxDate
and t.Container_Id = g.Container_Id
and t.RecordType_Id = g.RecordType_Id
order by t.Container_Id
, t.RecordType_Id
, t.Date
Однако я изо всех сил пытаюсь перевести это в правильный запрос LINQ. EF уже сам генерирует довольно большой запрос только для загрузки сущностей, что не позволяет мне понять, какая часть этого SQL-запроса действительно относится к запросу LINQ.