繁体   English   中英

如何计算C#中特定父节点下的子节点总数?

[英]How to count total child nodes under the specific parent in C#?

在过去的两天内,我一直在尝试计算C#中特定父级下的子级节点。 基本上,我的数据库中有一个SQL表,该表有2列:user_id,Users_parentId。 例:

__________________________
User_Id | Users_parentId
__________________________
100     | Noparent(main)
--------------------------
101     | 100(first User)
--------------------------
102     | 100
--------------------------
103     | 100
--------------------------
104     | 102 (3rd User)
--------------------------
105     | 100
--------------------------
106     | 102
--------------------------
107     | 102
--------------------------
111     | 107 (8th user)
--------------------------
112     | 107
--------------------------
115     | 105 (6th user)
--------------------------
222     | 105 
--------------------------
225     | 112
--------------------------
336     | 112
--------------------------
666     | 112
  • 如果我们从上表中生成一棵树,则它将如下所示:

      100 ----------^------------- | | | | 101 102 103 105 --------^------ ----^-------- | | | | | 104 106 107 115 222 ------^----- | | 111 112 ------^------ | | | 225 336 666 
  • 所以在我的项目中,我想计算所有孩子都在100岁以下

  • 基本上,我尝试使用get child list来计算他们的孩子,如果他们又再次获取grand_child的孩子列表,依此类推,以此类推。

  • 我尝试过使用for循环和foreach循环,但没有找到解决方案。

  • 我想在页面加载事件中计算子项总数(意味着现在100个子项包含14个子项)。

  • 当用户登录时,当时我想计算出所有属于他的孩子。

  • 我正在使用实体框架和LINQ来访问数据库,我的数据库名称为GetUnitedDB ,表名称为Office_Detail

  • 如果以上提供的任何错误或信息不完整,请通知我。 并请在C#中建议逻辑。

您可以使用以下模板将视图添加到SQL数据库:

;WITH UserTree AS
        (
            SELECT tn.User_Id UserId, tn.Users_parentId UserParentId, 0 AreaLevel
                FROM Office_Detail tn
                WHERE tn.Users_parentId = 100
            UNION ALL
                SELECT tn.User_Id, tn.Users_parentId, at.AreaLevel+1 AreaLevel
                FROM UserTree at
                    INNER JOIN Office_Detail tn on at.UserId = cn.Users_parentId                    
        )
        select COUNT(UserId)
        from UserTree   

还可以考虑将100的值更改为您用于user_id的类型的参数 ,并在视图请求中发送它。

(此模板还可用于创建带有其级别的树)

递归的C#实现:

private static int Count(int OriginalId)
    {
        using (var ctx = new YourDBContext())
        {
            return FindAllSons(OriginalId, ctx);
        }
    }

    private static int FindAllSons(int id, YourDBContext ctx)
    {
        var res = 1;
        var children = ctx.TableName.Where(x => x.ParentId == id).Select(n => n.Id);
        foreach(var child in children)
        {
            res += FindAllSons(child, ctx);
        }
        return res;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM