[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.存储过程名 进行调用,返回最终结果
然后直接 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)));
}
{
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
这个应该是用的递归方法去多次查询数据库。。
而不是在数据库里递归,也就是只查询一次数据库。。。
问了之前的leader 他说linq不可以递归查询,建议我写存储过程然后使用linq调用。也就像上面你说的那样的。。。
#10
结贴了!
#11
经使用,果然很妙,只是有一点不太明白:
递归的终止条件是什么?
有劳高人解惑
递归的终止条件是什么?
有劳高人解惑
#1
大神在哪里!!!
#2
哥,这便是.net砖区,sql建议去sql那边的高手多些!
#3
这是递归??
这能递归?
这能递归?
#4
你可以把你的逻辑直接写成存储过程,然后在dbml文件内映射此存储过程为相应的方法
然后直接 dataContxt.存储过程名 进行调用,返回最终结果
然后直接 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)));
}
{
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
这个应该是用的递归方法去多次查询数据库。。
而不是在数据库里递归,也就是只查询一次数据库。。。
问了之前的leader 他说linq不可以递归查询,建议我写存储过程然后使用linq调用。也就像上面你说的那样的。。。
#10
结贴了!
#11
经使用,果然很妙,只是有一点不太明白:
递归的终止条件是什么?
有劳高人解惑
递归的终止条件是什么?
有劳高人解惑