【问题标题】:How to do a recursive query in Linq2Sql?如何在 Linq2Sql 中进行递归查询?
【发布时间】:2010-10-07 04:57:54
【问题描述】:

我在数据库中有下表,MenuItems:

ID  ParentID  Name
--- --------- -----
1   0         Item 1
2   1         Item 2
3   1         Item 3
4   0         Item 4
5   3         Item 5

我想编写一个扩展方法来获取所有菜单项到树的根目录。像这样的:

public IQueryable<MenuItem> GetToRoot(this IQueryable<MenuItem> source, int menuItemID)
{
    return from m in source
           ????
           ????
           select m;
}

如果我用上面的数据为 ID 3 的菜单项调用这个扩展方法,我应该得到:

ID  ParentID  Name
--- --------- -----
1   0         Item 1
3   1         Item 3

Linq2Sql 是否可以只调用一次数据库?

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    我认为您无法在单个查询中完成此操作,这是我的想法:有效地发现项目的父项需要将表与其自身进行一次联接。每个额外的菜单级别都需要将表与其自身再连接一次。您需要多少个连接/附加级别才能到达根?你不会知道,直到你执行每一个,对吧?因此,无论是在数据库/SQL 方面还是在 LINQ to SQL 中,您都必须一次一步完成。

    如果您知道您的菜单系统不会超出某个深度,我想您可以设置一个 LINQ to SQL 查询,将表与其自身连接数次,但这听起来很难看。

    我的建议是在您的 DBML 设计器中设置表与其自身的关联,这将为您提供该类的父 EntityRef&lt;&gt; 属性。由于您的LoadOptions 中不允许循环(因此无法预加载父级),您可以在实体的部分OnLoaded() 方法中强制延迟加载父级。

    以下是一些相关的 SO 问题:

    https://stackoverflow.com/questions/1435229/hierarchy-problem-replace-recursion-with-linq-join LINQ to SQL for self-referencing tables?

    这是对问题的服务器端/SQL 处理:

    http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

    这里有人写了一些帮助代码:

    http://www.scip.be/index.php?Page=ArticlesNET18

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多