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

时间:2014-06-17 14:49:26

标签: c# entity-framework lazy-loading

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

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

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

2 个答案:

答案 0 :(得分:2)

如果你依赖儿童数据,那就急切加载它。如果仅在满足某些条件时才使用子数据,那么我会让它懒惰地加载孩子。

答案 1 :(得分:2)

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

  • 如果您需要来自每个家长的所有孩子,请加载他们"热切地" - 最小化到数据库服务器的往返次数是获取数据库的最常见技巧 - 访问应用程序运行得更快。
  • 如果您访问一小部分孩子,并且您想要所有父母,延迟加载可能会更好 - 当您需要在决定是否检查孩子之前看到父母时,你的大多数决定都表明你没有检查孩子,去做懒人装载:一次往返或两次不会造成比你需要的数据多十倍或二十倍的伤害。
  • 在某些情况下,您无法阅读整个层次结构 - 例如,因为只有直接父ID可用。在这种情况下,一个常见的技巧是制作一个"层次结构ID"从根父级的ID开始,并将其作为字段添加到所有后代。此字段允许您一次检索整个层次结构,然后修复内存中的引用。

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