【问题标题】:EF best way to load hierarchy(need all items)EF 加载层次结构的最佳方式(需要所有项目)
【发布时间】:2014-06-17 23:12:16
【问题描述】:

所以我有一个层次结构,我有一个递归函数来构建孩子。在每个级别,最好是Parent.Children(延迟加载)还是Context.Whatever.Where(x => x.ParentId == currentItemId)

如果有更好的方法来加载层次结构,我也在寻找其他建议。在一个查询中获取所有项目,然后在内存中构建层次结构会更好吗?

更多细节可能会有所帮助: 这只是用来构建一棵树。所以每个“级别”只需要一个 id 和 title 。我只有一棵简单的树(每个项目都有一个 ParentId)

【问题讨论】:

  • 表中的所有行是形成一棵树,还是存储多个较小的子树?

标签: c# entity-framework lazy-loading


【解决方案1】:

从 RDBMS 读取层次结构有多种注意事项:

  • 如果您需要每个父级的所有子级,请“急切地”加载它们 - 尽量减少到数据库服务器的往返次数是让您的数据库访问应用程序运行得更快的最常见技巧。李>
  • 如果您访问一小部分孩子,并且想要所有父母,延迟加载可能会更好 - 当您需要在决定是否检查孩子之前查看父母时,您的大部分结果证明你不检查孩子,去延迟加载:一两次往返不会像带来比你需要的多十到二十倍的数据那样伤害。
  • 在某些情况下您无法读取整个层次结构 - 例如,因为只有直接父级 ID 可用。在这种情况下,一个常见的技巧是从根父级的ID 创建一个“层次 ID”,并将其作为字段添加到所有后代。此字段可让您一次性检索整个层次结构,然后修复内存中的引用。

要做出决定,您应该构建一个小型原型,在其数据表中填充足够的行以进行分析,并以两种方式分析查询。请注意,在几乎空的数据库上分析查询是没有用的,因为时间将由往返控制。

【讨论】:

    【解决方案2】:

    如果您依赖子数据,则立即加载它。如果仅在满足某些条件时才使用子数据,那么我会让它延迟加载子数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2013-11-22
      相关资源
      最近更新 更多