在Entityframework中包含子对象

时间:2011-04-09 19:20:59

标签: entity-framework linq-to-entities iqueryable

我想在IQueryable列表中包含子对象..

我想在某些表类型IQueryable list ..

的选定列中包含一个子对象

我试过这样:

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

persons= persons.Include("Address");

这包括儿童物品不起作用..请帮助......我做错了... 非常感谢...

3 个答案:

答案 0 :(得分:3)

Include不适用于投影。而且不需要它。就这样做:

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

这里有几点:

  • Include
  • Address直接在投影中访问,EF将处理此
  • 我使用PersonDto作为投影目标。 PersonDto只有IdFirstNameAddress
  • 您可以投影到自定义类型或匿名类型,但不能投影到实体类型(映射类型) - 它不起作用,它会抛出异常。
  • 如果要使用映射类型,则不能仅返回选定的标量列 - 将始终加载所有列。只能选择性地加载导航属性。为了克服这个问题,人们有时会使用Table splitting,但如果你可以将你的大实体划分为不连续的实体,这就是有效的。在您的场景中,只使用投影。

答案 1 :(得分:2)

您无法在投影上使用Include(),请尝试以下操作:

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

您还有一个命名冲突,您投射到persons类型,并希望将结果保存在名为IQueryable的{​​{1}}中 - 其中一个错误。您是否有理由需要投影?你可以做到

persons

答案 2 :(得分:2)

首先:检查是否启用了延迟加载。启用后,我遇到了不同的结果。我更喜欢延迟加载被禁用。

第二:检查这个语法:

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

P.S。:有用的EF提示&amp;技巧:http://blogs.msdn.com/b/alexj/archive/2009/03/26/index-of-tips.aspx

<强>更新

包含不起作用,因为您在新创建的对象上使用它,而不是在上下文中可用的对象。你应该在创建新对象之前使用Include。

检查:

result = (From person In context.Persons.Include("Address") Select New With {.FirstName = item.FirstName, .AddressValue = item.Address.Value}).ToList();