Примечание. Это второй ответ, посвященный второстепенной проблеме в вашем коде.Сначала прочитайте другой ответ, так как я подозреваю, что это будет самый прямой ответ на ваш вопрос.
Ваш Select
отменяет / игнорирует ваш Include
.Include
(явно) используется для неявного и автоматического извлечения связанных сущностей, но Select
явно запрашивает другое возвращаемое значение, которое переопределяет установленные вами правила неявного включения.
Некоторые примеры, демонстрирующие, как оноworks:
var list = db.Products
.ToList();
Возвращает список продуктов без загруженных связанных объектов.
var list = db.Products
.Include(m => m.ProductOwner)
.ToList();
Возвращает список продуктов с загруженным свойством ProductOwner
.
var list = db.Products
.Select(p => p.Name)
.ToList();
var list2 = db.Products
.Include(m => m.ProductOwner)
.Select(p => p.Name)
.ToList();
Оба списка представляют собой список строк (с названиями продуктов).Делать Include
было неуместно.
var list = db.Products
.Select(p => p.ProductOwner.Name)
.ToList();
var list2 = db.Products
.Include(m => m.ProductOwner)
.Select(p => p.ProductOwner.Name)
.ToList();
Оба списка представляют собой список строк (с именами владельцев продуктов).Выполнение Include
не имело значения.
Это важная часть, на которую следует обратить внимание: вам не понадобился Include
, чтобы получить имя связанной ProductOwner
сущности .Это связано с тем, что ваш оператор Select
явно просил EF извлечь данные связанных сущностей, и, следовательно, EF не требовался Include
, потому что ему все равно не требовалась неявная загрузка связанных сущностей.
Это поведениеподдерживается для любого оператора Select
, включая те, в которых вы все еще используете полный объект Product
.Что означает:
var list = db.Products
.Select(p => new { Product = p })
.ToList();
var list2 = db.Products
.Include(m => m.ProductOwner)
.Select(p => new { Product = p })
.ToList();
В обоих случаях вы получите Product
сущность без его ProductOwner
, потому что EF слушает Select
и игнорирует любые другие инструкциио том, какие данные загружать (включая Include
).