То, что, как мне кажется, пропущен другой ответ, заключается в том, что вы запрашиваете подмножество связанных сущностей, т. Е. Не весь набор связанных сущностей.
Если вы хотите быть избирательным в отношении связанных сущностей, которые выбираются, вы не можете просто полагаться на оператор Include
(или неявную отложенную загрузку), потому что они настроены на загрузку всех связанных сущностей.
Нет выборочного Include
. Но вы можете сделать включительно Select
:
DateTime filterDate = DateTime.Now;
var myData = db.Meters
.Select(m => new
{
Meter = m,
Readings = m.Readings.Where(r => r.Date == filterDate)
})
.ToList();
Примечания
- Я использовал анонимный тип, но вы, конечно, можете также использовать конкретный класс DTO.
Where(r => r.Date == filterDate)
может быть улучшено (проверка для компонента Date
или диапазона), это всего лишь простой пример. Здесь вы можете использовать любые критерии фильтрации, которые вам нужны.
- Обратите внимание, что для этого вам не нужно выражение
Include
. Select
(для еще не перечисленного IQueryable
) не требуется явный Include
, поскольку сам Select
уже знает, какие данные вы хотите получить.
- Я предлагаю не помещать подмножество связанных сущностей в
meter.Readings
nav prop. Это приведет к путанице в отношении того, является ли этот список подмножеством или полным набором, и EF может фактически зарегистрировать это как изменение, когда вы вызываете SaceChanges()
. Навигационные элементы Nav не должны использоваться в качестве хранилища для коллекции того же типа, но с другим функциональным значением.