代码之家  ›  专栏  ›  技术社区  ›  RandomProgrammer

如何在Linq2Sql中进行递归查询?

  •  0
  • RandomProgrammer  · 技术社区  · 14 年前

    数据库中有以下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中,这可能吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    7 年前

    我不认为您可以在一个查询中完成它,我的想法是:有效地发现一个项的父项需要表本身的一个连接。每一个额外的菜单级别都需要一个表自身的连接。您需要多少个连接/附加级别才能到达根目录?你不表演就不知道了,对吧?因此,无论是在数据库/SQL方面,还是在linqtosql中,您都必须一步一步地执行每个步骤。

    如果你知道你的菜单系统不会超出一定的深度,我想你可以设置一个LINQ-to-SQL查询,把表和它本身连接起来那么多次,但是这听起来很难听。

    我建议在DBML设计器中设置表与自身的关联,这将为您提供一个父表 EntityRef<> 类的属性。因为你的 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