Я попытался использовать Include().ThenInclude() для DbContext, а затем выполнить ProjectTo, но в этом случае ProjectTo
переопределяет мои включения, и они игнорируются.
Это переопределение работает по назначению.
Select()
переопределяет Include()
Это явно указано в документации по EF. :
Если вы измените запрос таким образом, чтобы он больше не возвращал экземпляры типа сущности, с которого начался запрос, то операторы включения игнорируются.
В следующем примере операторы включения основаны на Blog
, но затем оператор Select
используется для изменения запроса для возврата анонимного типа. В этом случае операторы включения не действуют.
Включить
Include()
указывает EF загружать некоторые связанные сущности при получении запрошенного набора результатов. Это поведение добавлено к поведению загрузки EF по умолчанию:
var people = db.People.ToList();
var peopleWithPets = db.People.Include(person => person.Pets).ToList();
Добавив Include()
, вы существенно расширили поведение загрузки, которое происходит под капотом при перечислении коллекции (в данном случае ToList()
).
Выбрать
Select()
переопределяет поведение загрузки по умолчанию новым поведением, которое вы определили.
var people = db.People.ToList();
var names = db.People.Select(person => person.Name).ToList();
Когда вы вызываете Select()
, вы, по сути, указываете EF не выполнять поведение загрузки по умолчанию (которое может или не может повлечь за собой дополнительные включения), а вместо этого загружать точно то, что вы указали ( в данном случае person => person.Name
).
ProjectTo<>()
— это оболочка вокруг Select()
Вы можете думать о ProjectTo<TDestination>()
как о своего рода SelectFactory
, который генерирует соответствующий оператор Select
на основе сопоставления TDestination
, настроенного в Automapper.
Под капотом EF по-прежнему выполняет Select()
, и, следовательно, такое же поведение, как описано выше. применяется при использовании ProjectTo<>()
.
Если вы хотите включить дополнительные связанные объекты или какие-либо их свойства, вам необходимо развернуть сопоставление Automapper, а не использовать Include
в запросе. Если ваше сопоставление включает дополнительные поля, Automapper соответствующим образом расширит свои базовые Select()
.
Даже если бы вы могли включить связанные объекты с помощью Include
, Automapper все равно проигнорировал бы их, если бы вы никогда не определяли их как сопоставление.
person
Flater
schedule
14.02.2020
Include
. docs.automapper.org/en/latest/ - person Lucian Bargaoanu   schedule 14.02.2020