EF加载层次结构的最佳方式(需要所有项目)

本文关键字:项目 层次结构 加载 最佳 方式 EF | 更新日期: 2023-09-27 18:08:55

我有一个层次结构,我有一个递归函数来构建子节点。在每个级别上,是使用Parent.Children(惰性加载)还是Context.Whatever.Where(x => x.ParentId == currentItemId)

更好?

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

更多细节可能会有所帮助:这只是用来造树的。所以每个"关卡"只需要一个id和标题。我只有一个简单的树(每个项目都有一个ParentId)

EF加载层次结构的最佳方式(需要所有项目)

从RDBMS中读取层次结构有多个考虑因素:

  • 如果你需要每个父节点的所有子节点,那么"急切地"加载它们 -最小化到数据库服务器的往返次数是让你的数据库访问应用程序运行得更快的最常见的技巧。
  • 如果你访问了一小部分的子节点,而你想要所有的父节点,延迟加载可能更好 -当你需要在决定是否检查子节点之前查看父节点,而你的大多数决定结果是你不检查子节点时,选择延迟加载:一两次往返不会造成比你需要的数据多十倍或二十倍的伤害。
  • 在某些情况下,您无法读取整个层次—例如,因为只有直接父ID可用。在这种情况下,一个常见的技巧是从根父节点的ID创建一个"层次ID",并将其作为一个字段添加到所有的子节点。这个字段可以让你一次检索整个层次结构,然后在内存中修复引用。

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

如果您依赖于子数据,那么就立即加载它。如果只有在满足某些条件时才使用子数据,那么我会让它惰性加载子数据。