У меня есть отношение «многие ко многим» между родителями и дочерними элементами, использующее таблицу отношений, потому что эти отношения еще не поддерживаются автоматически в EF Core:
class Parent{
[Key]
public int Id{get;set;}
public List<ParentChild> ParentChilds{get;set;}
}
class Child{
[Key]
public int Id{get;set;}
public List<ParentChild> ParentChilds{get;set;}
}
class ParentChild{
public int ParentId{get;set;}
public Parent Parent{get;set;}
public int ChildId{get;set;}
public Child Child{get;set;}
}
Для редактирования родителя мне нужно получить ВСЕ его дочерние элементы. Похоже на работу для Include()
var db = new MyDbContext();
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.FirstOrDefault(p => p.Id == 1);
Это дало мне список ParentChild
точек. Но объект Child
ParentChild
не загружается автоматически, поэтому у меня есть только идентификатор дочернего элемента, но не сам дочерний объект, который мне нужен. Я нашел ThenInclude
, который, похоже, предназначен для таких случаев и из таких примеров, как этот а> я сделал следующее:
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.ThenInclude(p => p.Select(x => x.Child))
.FirstOrDefault(p => p.Id == 1);
Но выдает исключение:
Выражение свойства 'p => {from ParentChild x in p select [x].Child => FirstOrDefault()}' недопустимо. Выражение должно представлять доступ к свойству: 't => t.MyProperty'.
Итак, как это можно сделать? Я хотел бы избежать ненужных запросов, таких как выборка объекта вручную следующим образом:
user.ParentChilds.ForEach(pc => pc.Child = db.Childs.FirstOrDefault(x => x.Id == pc.ChildId));