gpt4 book ai didi

entity-framework - 如何使用 Entity Framework 进行递归加载?

转载 作者:行者123 更新时间:2023-12-03 12:15:32 24 4
gpt4 key购买 nike

我在带有 TreeNodes 表的数据库中有一个树结构。该表具有 nodeId、parentId 和 parameterId。在 EF 中,结构类似于 TreeNode.Children,其中每个 child 都是一个 TreeNode...
我还有一个包含 id、name 和 rootNodeId 的树表。

在一天结束时,我想将树加载到 TreeView 中,但我不知道如何一次加载它。
我试过:

var trees = from t in context.TreeSet.Include("Root").Include("Root.Children").Include("Root.Children.Parameter")
.Include("Root.Children.Children")
where t.ID == id
select t;

这将使我获得前 2 代,但不会更多。
如何加载包含所有代和附加数据的整个树?

最佳答案

我最近遇到了这个问题,并在我想出一个简单的方法来实现结果后偶然发现了这个问题。我对 Craig 的回答进行了编辑,提供了第四种方法,但决定的权力应该是另一个答案。这对我来说没问题 :)

My original question / answer can be found here.

只要您在表中的项目都知道它们属于哪棵树(在您的情况下看起来像它们: t.ID ),这就会起作用。也就是说,不清楚你真正在玩什么实体,但即使你有多个实体,你必须在实体 Children 中有一个 FK。如果那不是 TreeSet
基本上,只是不要使用 Include() :

var query = from t in context.TreeSet
where t.ID == id
select t;

// if TreeSet.Children is a different entity:
var query = from c in context.TreeSetChildren
// guessing the FK property TreeSetID
where c.TreeSetID == id
select c;

这将带回树的所有项目并将它们全部放在集合的根中。此时,您的结果集将如下所示:
-- Item1
-- Item2
-- Item3
-- Item4
-- Item5
-- Item2
-- Item3
-- Item5

因为您可能希望您的实体来自 EF 只有分层,这不是你想要的,对吧?

.. 然后,排除存在于根级别的后代:

幸运的是,因为您的模型中有导航属性,子实体集合仍将被填充,如您在上面的结果集插图中所见。通过使用 foreach() 手动迭代结果集循环,并将这些根项添加到 new List<TreeSet>() ,您现在将拥有一个包含根元素和正确嵌套的所有后代的列表。

如果您的树变大并且性能受到关注,您可以按 ParentID 对返回集 ASCENDING 进行排序。 (它是 Nullable ,对吧?)所以所有的根项目都是第一位的。像以前一样迭代和添加,但是一旦到达一个不为空的循环就中断循环。
var subset = query
// execute the query against the DB
.ToList()
// filter out non-root-items
.Where(x => !x.ParentId.HasValue);

现在 subset看起来像这样:
-- Item1
-- Item2
-- Item3
-- Item4
-- Item5

关于克雷格的解决方案:

  • 你真的不想为此使用延迟加载!!围绕 n+1 查询的必要性而构建的设计将是一个主要的性能问题。
  • *********(好吧,公平地说,如果你要允许用户有选择地向下钻取树,那么它可能是合适的。只是不要使用延迟加载来获取它们-前面!!)
  • 我从来没有尝试过嵌套集的东西,我也不建议修改 EF 配置来完成这项工作,因为有一个更简单的解决方案。
  • Another reasonable suggestion正在创建一个提供自链接的数据库 View ,然后将该 View 映射到中间连接/链接/m2m 表。就我个人而言,我发现这个解决方案比必要的要复杂,但它可能有它的用途。
  • 关于entity-framework - 如何使用 Entity Framework 进行递归加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2266473/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com