关于sql递归存储过程的问题

sql递归查询:

单表操作

  • 表数据(subTable表)
IdTitleParentIdRoleId
1展示01
2评估02
3基础数据01
4危险21
5错误41
6脆弱21
  • sql递归存储过程代码:
create proc proc_subTable
@Id int
as
--由父项递归下级
with rec(Id,Title,ParentId,RoleId)
as
(--父项
select * from dbo.subTable 
 where Id = @Id
 union all
--递归结果集中的下级
select t1.* from dbo.subTable t1
inner join rec as c on t1.ParentId = c.Id
)
select * from rec
  • 程序中调用
 SqlParameter[] param = new SqlParameter[1] { 
        new SqlParameter("@Id", 2) };
var r = from b in db.subTable.SqlQuery("exec proc_subTable @Id", param) select b;

多表操作

  • 表数据(subTable表、RoleInfo角色表、subTable表三个表关联)
  • sql递归存储过程代码:
create proc proc_subAndRole
@Id int
as
--由父项递归下级
with rec(Id,Title,ParentId,RoleId,role_Name)
as
(--父项
select t1.*,t2.role_Name from dbo.subTable t1 inner join RoleInfo t2 on t1.RoleId=t2.role_Id
 where t1.Id = @Id
 union all
--递归结果集中的下级
select t1.*,t2.role_Name from dbo.subTable t1 inner join RoleInfo t2 
on t1.RoleId=t2.role_Id 
inner join rec as c on t1.ParentId = c.Id
)
select b.*,d.Title as parentName from rec as b left join  dbo.subTable d on b.ParentId=d.Id

exec proc_subAndRole 2执行结果:

IdTitleParentIdRoleIdrole_NameparentName
2评估02超级管理员null
4危险21超级管理员评估
6脆弱21超级管理员评估
5错误41超级管理员危险
  • 程序中调用
 SqlParameter[] param = new SqlParameter[1] { 
        new SqlParameter("@Id", 2) };
var r = from b in db.subTable.SqlQuery("exec proc_subAndRole @Id", param) select b;

 var rModuleInfo = (from bd in
                    (from b in r
                    join d in db.RoleInfoes on b.RoleId equals d.role_Id
                    select new { b, d.role_Name })
                   join m in db.subTable on bd.b.ParentId equals m.Id into Info
                  from mi in Info.DefaultIfEmpty()
                  select new { bd, parentName = (mi == null) ? "" : mi.Title }).Skip(iSkip).Take(iTop).ToList();

问题

  • 前提使用的EF

因为我无法实现直接执行多表连接后的存储过程proc_subAndRole,所以我只能这样先递归查询了,再进行表连接。目前我是用的递归是这样的,如果有更好的解决方案望不吝赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值