Включение дочерних объектов в Entityframework - PullRequest
2 голосов
/ 09 апреля 2011

Я хочу включить дочерние объекты в список IQueryable ..

Я хочу включить дочерний объект в выбранные столбцы списка IQueryable некоторого типа таблицы.

Я пытался так:

IQueryable<Persons> persons = Context.Persons.Select(x=> new persons{Pkid=x.pkid, FirstName=x.FirstName}).AsQueryable();

persons= persons.Include("Address");

это включение дочерних объектов не работает .. кто-нибудь, пожалуйста, помогите ..., где я делаю неправильно .. большое спасибо ...

Ответы [ 3 ]

3 голосов
/ 10 апреля 2011

Include не работает с проекцией.Причем это не нужно.Просто сделайте это:

var query = context.Persons
                   .Select(x => new PersonDto
                       {
                          Id = x.pkid, 
                          FirstName = x.FirstName,
                          Address = x.Address
                       });

Несколько точек здесь:

  • Нет Include
  • Address, к которым обращаются непосредственно в проекции, EF справится с этим
  • Я использую PersonDto в качестве цели проекции.PersonDto имеет только Id, FirstName и Address.
  • Вы можете проецировать на пользовательский тип или анонимный тип, но вы не можете проецировать на тип сущности (сопоставленный тип) - это не работаети выдает исключение.
  • Если вы хотите использовать сопоставленный тип, вы не можете возвращать только выбранные скалярные столбцы - все столбцы всегда будут загружены.Только свойства навигации могут быть загружены выборочно.Чтобы преодолеть это, люди иногда используют разбиение таблицы , но это то, что работает, если вы можете разделить свою большую сущность на несвязанные сущности.В вашем сценарии используйте только проекцию.
2 голосов
/ 09 апреля 2011

Первый: проверьте, включена ли отложенная загрузка или нет.Я получил разные результаты, когда он был включен.Я предпочитаю, чтобы ленивая загрузка была отключена.

Второе: проверьте этот синтаксис:

result = (From person In context.Persons.Include("Address")).ToList();

PS : Полезные советы и рекомендации EF: http://blogs.msdn.com/b/alexj/archive/2009/03/26/index-of-tips.aspx

ОБНОВЛЕНИЕ:

Включить не работает, поскольку вы используете его для вновь создаваемых объектов, а не для объектов, доступных в контексте.Вы должны использовать Включить перед созданием новых объектов.

Проверьте это:

result = (From person In context.Persons.Include("Address") Select New With {.FirstName = item.FirstName, .AddressValue = item.Address.Value}).ToList();
2 голосов
/ 09 апреля 2011

Вы не можете использовать Include() в проекции, попробуйте это:

Iquerable<Persons> persons = Context.Persons
                                    .Include("Address")
                                    .Select(x=> new persons{Pkid=x.pkid, FirstName=x.FirstName})
                                    .AsQuerable();

Также у вас есть конфликт имен, вы проецируете на тип persons и хотите сохранить результаты в IQueryable с именем persons - один из них неправильный. Есть ли причина, по которой вам нужен проект? Вы могли бы просто сделать

Iquerable<Persons> persons = Context.Persons.Include("Address");
...