EF:加载相关对象的相关对象

时间:2014-01-17 10:29:22

标签: c# entity-framework

我找不到从DB加载对象及其所有相关对象的方法。关于这个简化的模型(ID-Properties未显示):

class MainClass 
{  
    public virtual ICollection<FirstLevelClass> FirstLevelObjects {get; set;}  
}

class FirstLevelClass
{  
    public virtual ICollection<SecondLevelClassA> SecondLevelObjectsA {get; set;}
    public virtual ICollection<SecondLevelClassB> SecondLevelObjectsB {get; set;}
}

class SecondLevelClassA
{
    public virtual int SomeValue {get; set;}

}
class SecondLevelClassB
{
    public virtual int SomeValue {get; set;}

}

DbContext位于“MainClass” - 对象:

public SampleContext : DbContext
{
    public DbSet<MainClass> MainClassObjects {get; set;}
}

如何使用所有第一级和第二级对象从db加载MainClass对象?我能做到:

using (var context = new SampleContext())
{
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects).ToList();

    // ...move objects from the context to program logic...

}

但我如何获得SecondLevelObjects?我错过了类似的东西:

using (var context = new SampleContext())
{
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects.SecondLevelObjects).ToList();

    // ...move objects from the context to program logic...

}

这是可能的,还是我必须在DbContext中调整DbSets?

2 个答案:

答案 0 :(得分:2)

一种解决方案可以是使用Include方法的其他重载,它采用如下字符串:

var MainClassObjects = context.MainClassObjects
.Include("FirstLevelObjects")
.Include("FirstLevelObjects.SecondLevelObjects")
.ToList();

<强>更新

当您使用此方法时,您只需确定要获取的路径,以便更新问题,您可以使用此方法:

var MainClassObjects = context.MainClassObjects
.Include("FirstLevelObjects.SecondLevelObjectsA")
.Include("FirstLevelObjects.SecondLevelObjectsB")
.ToList();

答案 1 :(得分:1)

试试这个:

using (var context = new SampleContext())
{
    var MainClassObjects = context.MainClassObjects.Include(p => p.FirstLevelObjects.SelectMany(s => s.SecondLevelObjects)).ToList();

// ...move objects from the context to program logic...

}

您应该添加.Select()语句来获取对象或列表。