2016-05-17 102 views
0

我遇到了一个问题:我有一个表引用了另一个表,它有一个引用另一个表的引用列表,它有另一个引用列表,而我想要加载所有这一切。实体框架急切加载实体列表内的实体列表

基本上,这个想法是:

public class User { 
    public ClassL1 l1 { get; set; } 
} 

ClassL1 { 
    public List<ClassL2> l2 { get; set; } 
} 

ClassL2 { 
    public List<ClassL3> l3 { get; set; } 
} 

ClassL3 { 
    //some basic string or int values 
} 

而目前,我试图用这样的加载它,但无济于事:

user = context.Users 
    .Where(u => u.UserName == model.Username) 
    .Include(u => u.l1) 
    .ThenInclude(l1 => l1.l2) 
    .ThenInclude(l2List => l2List.Select(l2Single => l2Single.l3))//This doesn't work 
    //.Include(u => u.l1.l2.Select(l2Single => l2Single.l3)) //Neither does this 
    .First(); 

我怎么加载列表的列表,如果选择不工作?任何帮助,将不胜感激。

编辑: 好,因为显然是在这个开放的错误,我去一个愚蠢的修复,并使其像这样的工作:

user = context.Users 
    .Where(u => u.UserName == model.Username) 
    .Include(u => u.l1) 
    .ThenInclude(l1 => l1.l2) 
    .First(); 
for (int i = 0; i < user.l1.l2.Count; i++) 
{ 
    user.l1.l2[i].l3 = context.l3DB 
    .Where(p => p.l2.Id == user.l1.l2[i].Id) 
    .ToList(); 
} 

而且这个工作,我添加引用了(给家长)。 例如:

public class ClassL2 { 
    public List<ClassL3> l3 { get; set; } 
    public ClassL1 l1 { get; set; }//reference to parent 
} 

回答

1

如何:自

user = (from usr in context.Users 
     where usr.UserName == model.Username 
     select new 
     { 
      usr, 
      usr.l1, 
      l2List = from l2 in usr.l1.l2 
        select new 
        { 
         l2, 
         l2.l3 
        } 
     }).AsEnumerable().Select(m => m.usr).First(); 
+0

似乎不起作用。我收到一个错误: “在'Microsoft.Data.Entity.Query.Internal.EntityQueryable'1 [ClassL3]'和'System.Collections.Generic.List'1 [ClassL3]'类型之间没有定义强制操作符。” –

+0

也许这是你映射的问题。你使用哪个版本的EF? –

+0

“EntityFramework.Commands”:“7.0.0-rc1-final” “EntityFramework.Core”:“7.0.0-rc1-final” 我也这么认为,但我找不到解决方法,有一个名字与它的名字相同,改变了这一点,但错误仍然存​​在。如果这有什么帮助的话,我可以上传关于这个问题的代码片段。 –

0

检查:

user = context.Users 
    .Where(u => u.UserName == model.Username) 
    .Include(u => u.l1) 
    .ThenInclude(l1 => l1.l2) 
    .ThenInclude(l2 => l2.l3) 
    .First(); 
+0

这是不行的,L2是一个列表,我不能从那里访问的特性,它不是一个单一的元素。这就是我的问题所在,如果它的工作很容易,我不会有问题,但现在我必须先选择。 –