Linq To Sql 如何实现递归查询 树形结构

时间:2023-01-02 00:26:27
CREATE TABLE [dbo].[MenuInfo](
[Id] [bigint] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Parent] [bigint] NOT NULL,
[Type] [int] NULL,
[Url] [varchar](100) NULL,
[Flag] [int] NULL,
[Note] [varchar](200) NULL
)

需求:查询指定节点下的所有节点,即指定节点下的所有子级节点以及子级节点下的子级节点。。。
无限递归直到不存在子级节点。

sql 的实现是这样的
WITH temp
AS
(
--父项
SELECT * FROM MenuInfo WHERE Parent = 3
UNION ALL
--递归结果集中的下级
SELECT m.* FROM MenuInfo AS m
INNER JOIN temp AS child ON m.Parent = child.Id
)
SELECT * FROM temp

请高手赐教linq to sql 语句该如何写

分不多,请见谅。。。

11 个解决方案

#1


大神在哪里!!!

#2


哥,这便是.net砖区,sql建议去sql那边的高手多些!

#3


这是递归??
这能递归?

#4


你可以把你的逻辑直接写成存储过程,然后在dbml文件内映射此存储过程为相应的方法
然后直接  dataContxt.存储过程名 进行调用,返回最终结果

#5


Try:


public IEnumerable<MenuInfo> GetClassID(int p_id)
        {
            var query = from c in db.MenuInfo
                        where c.Parent  == p_id
                        select c;
           return  query.Concat(query.SelectMany(t => GetClassID(t.Id)));              
        }

#6


public IEnumerable<iwms_class> GetClassID(int id)
        {
            var query = from c in TableName
                        where c.parentID == id
                        select c;
          return  query.Concat(query.SelectMany(t => GetClassID(t.NodeID)));              
        }

#7



public IEnumerable<MenuInfo> GetClassID(int p_id)
{
var query = from c in this.MenuInfo
where c.Parent  == (long)p_id
select c;
 
   return  query.ToList().Concat(query.ToList().SelectMany(t => GetClassID((int)t.Id)));              
}
刚刚用数据实际测试了一下,应该这样就能得到你想要的值了:

#9


引用 6 楼  的回复:
public IEnumerable<iwms_class> GetClassID(int id)
  {
  var query = from c in TableName
  where c.parentID == id
  select c;
  return query.Concat(query.SelectMany(t => GetClassID(t.NodeID)));  
……


这个应该是用的递归方法去多次查询数据库。。
而不是在数据库里递归,也就是只查询一次数据库。。。
问了之前的leader 他说linq不可以递归查询,建议我写存储过程然后使用linq调用。也就像上面你说的那样的。。。

#10


结贴了!

#11


经使用,果然很妙,只是有一点不太明白:
递归的终止条件是什么?
有劳高人解惑

#1


大神在哪里!!!

#2


哥,这便是.net砖区,sql建议去sql那边的高手多些!

#3


这是递归??
这能递归?

#4


你可以把你的逻辑直接写成存储过程,然后在dbml文件内映射此存储过程为相应的方法
然后直接  dataContxt.存储过程名 进行调用,返回最终结果

#5


Try:


public IEnumerable<MenuInfo> GetClassID(int p_id)
        {
            var query = from c in db.MenuInfo
                        where c.Parent  == p_id
                        select c;
           return  query.Concat(query.SelectMany(t => GetClassID(t.Id)));              
        }

#6


public IEnumerable<iwms_class> GetClassID(int id)
        {
            var query = from c in TableName
                        where c.parentID == id
                        select c;
          return  query.Concat(query.SelectMany(t => GetClassID(t.NodeID)));              
        }

#7



public IEnumerable<MenuInfo> GetClassID(int p_id)
{
var query = from c in this.MenuInfo
where c.Parent  == (long)p_id
select c;
 
   return  query.ToList().Concat(query.ToList().SelectMany(t => GetClassID((int)t.Id)));              
}
刚刚用数据实际测试了一下,应该这样就能得到你想要的值了:

#8


#9


引用 6 楼  的回复:
public IEnumerable<iwms_class> GetClassID(int id)
  {
  var query = from c in TableName
  where c.parentID == id
  select c;
  return query.Concat(query.SelectMany(t => GetClassID(t.NodeID)));  
……


这个应该是用的递归方法去多次查询数据库。。
而不是在数据库里递归,也就是只查询一次数据库。。。
问了之前的leader 他说linq不可以递归查询,建议我写存储过程然后使用linq调用。也就像上面你说的那样的。。。

#10


结贴了!

#11


经使用,果然很妙,只是有一点不太明白:
递归的终止条件是什么?
有劳高人解惑