Как получить объекты с подмножеством связанных объектов? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть две сущности в отношении один-ко-многим: Метр (1) -> (n) Показания

Я считаю, что мои две сущности настроены правильно для обеспечения связи, поэтому предположим, что.

Я хочу получить Метры со связанными Показаниями, но, поскольку может быть много Показаний на метр, я хочу ограничить его, например, Reading.Date. Другим вариантом может быть чтение не более X показаний на метр.

Как я могу это сделать в EF.Core?

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

То, что, как мне кажется, пропущен другой ответ, заключается в том, что вы запрашиваете подмножество связанных сущностей, т. Е. Не весь набор связанных сущностей.

Если вы хотите быть избирательным в отношении связанных сущностей, которые выбираются, вы не можете просто полагаться на оператор 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 не должны использоваться в качестве хранилища для коллекции того же типа, но с другим функциональным значением.
0 голосов
/ 28 мая 2019

Если ваши таблицы спроектированы правильно, т. Е. Ключ в Meter отображается с помощью «Чтение» (см. Ограничения внешнего ключа), тогда EF автоматически выдает связанные записи при доступе к его классу POCO.Убедитесь, что для чтения есть внешний ключ для таблицы метра в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...