加载实体的所有子项

时间:2017-09-12 12:03:34

标签: c# entity-framework asp.net-core entity-framework-core

嘿,我有以下课程:

public class Tree 
{
  public int Id { get; set; }
  public Tree Parent { get; set; }
  public ICollection Chidren { get; set; } 
}

我想获得所有相关实体。

我的树状结构如下所示:

- Root (id 1)
  -- Cat1 (id 2)
     --SubCat 1 (id 4)
     --SubCat 2 (id 5)
  -- Cat2 (id 3)

如果我试图让所有实体使用:

_context.Entity.FirstOrDefault(x => x.Id == 1)
               .Include(x => x.Children)

它给了我Root,cat1和cat2(作为孩子),但是Cat1和Cat2的孩子们都失踪了。 是否有可能获得所有相关实体,从根实体开始,到#34;儿童的孩子结束"?

1 个答案:

答案 0 :(得分:1)

好的,我理解。

像这里解释一样:Understanding .AsEnumerable() in LINQ to SQL

AsEnumerable()和ToList()将SQL查询发送到数据库。因此,使用SQL端加载包含所有子对象的所有数据,然后在代码端过滤ID。

如果你在SQL查询中执行FirstOrDefault(),你将只获得id = 1的树和他的第一个孩子。

您可以使用:

 var tree = _context.Trees
        .Include(x => x.Children)
        .AsEnumerable()
        .FirstOrDefault(x => x.Id == 1);

但是要小心,也许你正在加载这么多数据,它可能非常繁重和缓慢,具体取决于数据库大小。

否则,您可以加载2次,首先加载#1元素,然后加载他的孩子。