1

我有一个公司的树状表示,它存储在数据库中,如下表:

  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?

4

3 回答 3

1

AFAIK 递归函数是唯一的方法。前段时间我问了类似的问题,并意识到 EF 或 LINQ 无法为您计算。

我的问题:使用 LINQ 获取子类别中的所有项目

于 2012-10-22T22:33:06.723 回答
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

演示: http ://sqlfiddle.com/#!3/b5d1d/10

于 2012-10-22T23:12:04.473 回答
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 是可用的子分支数。

于 2012-10-22T22:50:03.083 回答