我想在IQueryable list中包含子对象。
我想在一些表类型IQueryable list..的选定列上包含一个子对象。
我试过了:
IQueryable<Persons> persons = Context.Persons.Select(x=> new persons{Pkid=x.pkid, FirstName=x.FirstName}).AsQueryable();
persons= persons.Include("Address");
包含的子对象不工作,谁来帮忙…我哪里做错了…谢谢…
Include
不能与投影一起工作。此外,这是不必要的。只需这样做:
var query = context.Persons
.Select(x => new PersonDto
{
Id = x.pkid,
FirstName = x.FirstName,
Address = x.Address
});
这里有几点:
- No
Include
-
Address
直接在投影中访问,EF将处理此 - 我使用
PersonDto
作为投影目标。PersonDto
只有Id
,FirstName
和Address
。 - 你可以投影到自定义类型或匿名类型,但你不能投影到实体类型(映射类型)-它不工作,并抛出异常。
- 如果你想使用映射类型,你不能只返回选定的标量列-所有列将始终被加载。只有导航属性可以选择性地加载。为了克服这个问题,人们有时会使用表分割,但如果你能把你的大实体分割成不相连的实体,这是有效的。在您的场景中,只使用投影。
不能在投影上使用Include()
,请尝试:
Iquerable<Persons> persons = Context.Persons
.Include("Address")
.Select(x=> new persons{Pkid=x.pkid, FirstName=x.FirstName})
.AsQuerable();
你也有一个命名冲突,你项目到一个类型persons
,并希望在一个名为persons
的IQueryable
中保存结果-其中一个是错误的。你需要投影有什么原因吗?你可以直接输入
Iquerable<Persons> persons = Context.Persons.Include("Address");
首先:检查延迟加载是否启用。当它被启用时,我经历了不同的结果。我更喜欢禁用延迟加载
第二步:检查语法:result = (From person In context.Persons.Include("Address")).ToList();
注::实用的EF技巧&窍门:http://blogs.msdn.com/b/alexj/archive/2009/03/26/index-of-tips.aspx
更新:
Include不起作用,因为您正在对新创建的对象使用它,而不是在上下文中可用的对象。你应该在创建新对象之前使用Include。
检查:
result = (From person In context.Persons.Include("Address") Select New With {.FirstName = item.FirstName, .AddressValue = item.Address.Value}).ToList();