我有一个像公司代表的树,它存储在数据库中,如下表所示:
ID ParentID Name
==================================
1 NULL Company
2 1 Division one
3 1 Division two
4 1 Division three
5 2 Department 1.1
6 3 Department 2.1
7 3 Department 2.2
8 3 Department 2.3
9 4 Department 3.1
10 NULL Company 2
现在,当我向用户授予权限时,我需要将他分配给上表中的一个组,如果我将他分配给一个组,他将自动拥有子组的权限。如果它是关于一个组,我可以很容易地检查这个。但是,例如,如果我授予用户权限(分区2),然后用户正在进行某些事务(部门2.2),我需要找到一种自动允许转换的方法,因为用户已被允许在父组上。我只能想到递归方法,其中我检查目标组,如果用户没有权限并且它有一个父组,那么我回想一下相同的方法来验证它的父级,依此类推,直到我找到一个允许用户的组用于或到达根组,而不是对用户进行身份验证。请记住,孩子可以在其中有另一个孩子,等等。
有没有办法以更好的方式做到这一点?使用Linq还是普通的旧T-SQL?
答案 0 :(得分:1)
AFAIK递归功能是唯一可行的方法。前段时间我问了类似的问题,并且意识到EF和LINQ都无法为你计算。
答案 1 :(得分:1)
我知道您要检查父母的所有孩子。
with tmp as (
select id, parentId, name, 0 as iteration
from t
where id = 3 -- you wanted parent
union all
select parent.id, parent.parentId, parent.name, child.iteration + 1
from tmp child
join t parent on child.id = parent.parentId
)
select id, parentId, name from tmp
order by iteration
答案 2 :(得分:0)
这样可行:
public class Permission
{
public ID { get; set; }
public ParentID { get; set; }
public Name { get; set; }
}
int userPermissionID = 3; // Division two
int objectPermissionID = 7; // Department 2.2
bool hasAccess = false;
List<int> check = new List<int>();
check.add(objectPermissionID);
hasAccess = userPermissionID == objectPermissionID;
while(!hasAccess && check.count > 0)
{
var permissions = context.Permissions
.Where(p => check.Contains(p.ID))
.ToList();
hasAccess = permissions.Any(p => p.ParentID = userPermissionID)
check = permissions.Select(p => p.ParentID).ToList();
}
if (hasAccess)
{
..
您最多可以访问数据库X次,其中X是可用的子分支数。