EntityFramework的Include用法问题

Eason0807 2018-04-16 02:48:59
假设有这么一个树形的Model

public class Department
{
[Key]
public Guid Id{get;set;}
public string Name{get;set;}
public Guid? ParentId{get;set;}
[ForeignKey("ParentId")]
public Department Parent{get;set;}
public virtual ICollection<Department> Children{get;set;}

}


查询的时候这么写 dbContext.Set<Department>().Where(d => d.ParentId == null).Include(d => d.Children);
而如果我想要一次性查询出来的时候,由于不知道会有多少层,就不能一直这么Include下去;我想问下有经验的大牛们,遇到这种情况怎么处理的?
...全文
991 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2018-04-16
  • 打赏
  • 举报
回复
引用 6 楼 weixin_38641834 的回复:

public IEnumerable<Module> RootModules()
{
    using (DbContext context = new DbContext())
    {
        IRepository<Module> rm = new Repository<Module>(context);
        IList<Module> modules = rm.Set.Where(p => p.ParentModule == null).ToList();
        foreach (Module m in modules)
        {
            GetModules(m, rm);
        }
        return modules;
    }
}

protected void GetModules(Module module, IRepository<Module> rm)
{
    IList<Module> modules = rm.Set.Where(p => p.ParentModule.ID == module.ID).ToList();
    module.ChildrenModules.Concat(modules);
    foreach (Module m in modules)
        GetModules(m, rm);
}
上边这种方法是执行了多次数据库查询的,我想知道有没有办法只查询一次数据库就能搞定
主要是出在 protected void GetModules(Module module, IRepository<Module> rm) { IList<Module> modules = rm.Set.Where(p => p.ParentModule.ID == module.ID).ToList(); module.ChildrenModules.Concat(modules); foreach (Module m in modules) GetModules(m, rm); } 这个方法上,你递归里 IList<Module> modules = rm.Set.Where(p => p.ParentModule.ID == module.ID).ToList();就是会去查询。 如果可以的话,你把整个的Module方到缓存里。
Eason0807 2018-04-16
  • 打赏
  • 举报
回复

public IEnumerable<Module> RootModules()
{
    using (DbContext context = new DbContext())
    {
        IRepository<Module> rm = new Repository<Module>(context);
        IList<Module> modules = rm.Set.Where(p => p.ParentModule == null).ToList();
        foreach (Module m in modules)
        {
            GetModules(m, rm);
        }
        return modules;
    }
}

protected void GetModules(Module module, IRepository<Module> rm)
{
    IList<Module> modules = rm.Set.Where(p => p.ParentModule.ID == module.ID).ToList();
    module.ChildrenModules.Concat(modules);
    foreach (Module m in modules)
        GetModules(m, rm);
}
上边这种方法是执行了多次数据库查询的,我想知道有没有办法只查询一次数据库就能搞定
Eason0807 2018-04-16
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
[quote=引用 2 楼 weixin_38641834 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 你把Include去掉,然后调试看一下 , Department对象包括关联的children也是有的
会延时加载,我的主要目的是一次性取出来(数据量不大)[/quote] 那你直接 dbContext.Set<Department>().Where(d => d.ParentId == null).ToList(); 就好了。这样就直接全部取出来了。[/quote] 不好意思,是我问的有问题, dbContext.Set<Department>().Where(d => d.ParentId == null)这句之后,dbContext就被释放了,原型是在一个using里边的
Eason0807 2018-04-16
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
[quote=引用 2 楼 weixin_38641834 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 你把Include去掉,然后调试看一下 , Department对象包括关联的children也是有的
会延时加载,我的主要目的是一次性取出来(数据量不大)[/quote] 那你直接 dbContext.Set<Department>().Where(d => d.ParentId == null).ToList(); 就好了。这样就直接全部取出来了。[/quote] 我说的一次性全取出来是指包括它的children,以及children的children;按你说的是取不出来的
正怒月神 2018-04-16
  • 打赏
  • 举报
回复
引用 2 楼 weixin_38641834 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 你把Include去掉,然后调试看一下 , Department对象包括关联的children也是有的
会延时加载,我的主要目的是一次性取出来(数据量不大)[/quote] 那你直接 dbContext.Set<Department>().Where(d => d.ParentId == null).ToList(); 就好了。这样就直接全部取出来了。
Eason0807 2018-04-16
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
你把Include去掉,然后调试看一下 , Department对象包括关联的children也是有的
会延时加载,我的主要目的是一次性取出来(数据量不大)
正怒月神 2018-04-16
  • 打赏
  • 举报
回复
你把Include去掉,然后调试看一下 , Department对象包括关联的children也是有的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧