2016-02-26 79 views
4

我试图从数据库中使用实体框架获取表。实体框架 - 包含多个级别属性

该表格引用了其他表格,该表格再次引用了其他表格。 我知道如何包含其他表格。而根据this的答案,这MSDN page包括多个层面是这样的:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3)); 

但我的问题是,如何将其纳入另一个表第3级?

这似乎不工作:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3).Select(tLvl2 => tLvl2.AnotherTableLevel3); 
+0

请向我们展示表班级代码。 –

回答

9

添加另一个Include电话:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3)) 
        .Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.AnotherTableLevel3)); 

如果你想加载相关实体处于同一水平,你应该呼吁每个Include扩展方法其中。

4

可以进行多次Include()电话:

entity.TableLevel1.Include(t1 => t1.TableLevel2); 
entity.TableLevel1.Include(t1 => t1.TableLevel2.Select(t2 => t2.TableLevel3)); 
entity.TableLevel1.Include(t1 => t1.TableLevel2.Select(t2 => t2.AnotherTableLevel3)); 

entity.TableLevel1.Include("TableLevel2"); 
entity.TableLevel1.Include("TableLevel2.TableLevel3"); 
entity.TableLevel1.Include("TableLevel2.AnotherTableLevel3"); 

但是你可以为virtual标记您的导航性能,将延迟加载,所以你不需要做出Include()电话:

class TableLevel1 
{ 
    public virtual TableLevel2 TableLevel2 { get; set; } 
} 

class TableLevel2 
{ 
    public virtual TableLevel3 TableLevel3 { get; set; } 

    public virtual TableLevel3 AnotherTableLevel3 { get; set; } 
} 
+3

Arturo,有两件事我想告诉你关于你的解决方案。第一件事是你的第一个'Include'调用是不必要的,该级别将被加载其他任何两个'Include'调用。第二件事是,如果他们想在其上下文已经处理的地方使用它们的实体,懒惰加载不是一个选项,将抛出异常。 – octavioccl