如何在Entity Framework 5中包含子对象的子对象


138

我正在使用Entity Framework 5 code firstASP.NET MVC 3

我在努力填充子对象的子对象。以下是我的课程。

应用类别

public class Application
{
     // Partial list of properties

     public virtual ICollection<Child> Children { get; set; }
}

子班:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

ChildRelationshipType类:

public class ChildRelationshipType
{
     public int Id { get; set; }

     public string Name { get; set; }
}

存储库中的GetAll方法的一部分,以返回所有应用程序:

return DatabaseContext.Applications
     .Include("Children");

Child类包含对ChildRelationshipType类的引用。要与应用程序的子级一起工作,我将得到以下内容:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

我在这里收到一个错误,对象上下文已经关闭。

如何指定每个子对象都必须ChildRelationshipType像上面一样包含该对象?


Answers:


256

如果包含库System.Data.Entity,则可以使用Include()方法的重载,该方法采用lambda表达式而不是字符串。然后Select(),您可以使用Linq表达式而不是string路径来遍历子级。

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));

6
正如GraemeMiller所说的那样,强类型类在可维护性方面比使用字符串更好
Ryan Amies 2012年

lamba方法有哪些版本可用?我被困在EF 4.0 Codebase上..无法使lamda运行。感谢您的任何投入。
granadaCoder 2014年

5
它将在EF 4中运行,只需确保添加对System.Data.Entity;
Ryan Amies

5
仅供参考-在EF 6中,命名空间为Microsoft.Data.Entity
Brad

使用EF 5,我无法获得.Select(x => x.Child),但是可以正常工作-Entities.UserProfilestoredProfile = db.UserProfiles .Include(s => s.ShippingAddress).Include(st => st.ShippingAddress。 StateProvince).Include(b => b.BillingAddress).Include(bs => bs.BillingAddress.StateProvince).FirstOrDefault(x => x.UserId == userId);
Geovani Martinez,

91

通过.NET Core中的EF Core,您可以使用关键字ThenInclude

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

包括来自儿童收藏的儿童:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);

6
谢谢!!!真的很有帮助!有时候,您可能会误会智能感知,而忽略它并构建!:)
muhihsan

不错,我一直在寻找.net core :)
Andy Clarke

1
如果Children是一个集合并且我需要在其下包含属性该怎么办?
dodbrian '18

为此找到了一个超载。起初并不明显。
dodbrian '18

1
@dodbrian重载是什么?我正在尝试嵌套.ThenInclude,其中孩子是一个集合。
格雷格·哈丁

22

我最终做了以下工作,它可以工作:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");

76
强类型方式更好。魔术字符串不利于重构
GraemeMiller 2012年

2

使用通用存储库模式并为此实现通用解决方案的一个很好的例子可能看起来像这样。

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

我将如何调用上述方法?你能提供一个例子
Jamee

@Jamee -List <Expression <Func <PersonObject,object >>> includers =新的List <Expression <Func <PersonObject,object >>>(); includers.Add(x => x.FirstName); Get <PersonObject>(includers);
gcoleman0828年

1
查询来自...?
Doug Beard

抱歉@DougBeard,没有关注您的问题。
gcoleman0828年

1
@ gcoleman0828上面的代码片段中的查询变量。它神奇地实例化了吗?它从何而来?
Doug Beard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.