实体框架——包括实体框架中的子对象



我想在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, FirstNameAddress
  • 你可以投影到自定义类型或匿名类型,但你不能投影到实体类型(映射类型)-它不工作,并抛出异常。
  • 如果你想使用映射类型,你不能只返回选定的标量列-所有列将始终被加载。只有导航属性可以选择性地加载。为了克服这个问题,人们有时会使用表分割,但如果你能把你的大实体分割成不相连的实体,这是有效的。在您的场景中,只使用投影。

不能在投影上使用Include(),请尝试:

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

你也有一个命名冲突,你项目到一个类型persons,并希望在一个名为personsIQueryable中保存结果-其中一个是错误的。你需要投影有什么原因吗?你可以直接输入

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();

最新更新