实体框架在实体列表中急切加载实体列表

时间:2016-05-17 00:21:39

标签: c# entity-framework linq-to-entities eager-loading

我遇到了一个问题:我有一个对另一个表有引用的表,它有一个对另一个表的引用列表,它有另一个引用列表,我想要加载所有这些。< / p>

基本上,这个想法是:

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

如果选择不起作用,我该如何加载列表列表?任何帮助将不胜感激。

编辑: 好吧,因为显然这是一个开放的bug,我带着一个愚蠢的修复,并使其工作如下:

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
}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

检查一下:

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