使用LINQ检索关系数据

发布于 2025-01-25 18:16:52 字数 2733 浏览 1 评论 0原文

我正在开发.NET Core和Dapper ORM框架中的REST API。我的问题是,我正在尝试使用LINQ从数据库表中检索层次菜单结构,并通过API响应传递。 问题是菜单表具有 3级菜单,但在输出中只显示了两个级别,请指导我如何获取/添加/添加/检索第三级的儿童菜单和响应返回而不是null

我有两个表格,例如:

tbluicomponents:

Id       Name        ParentId
1        Home          0
2        About         0
3        ContactUs     0
4        Department    2
5        Achivements   2
6        CSE           4
7        CIVIL         4 
8        ETC           4
9        MECH          4

tblroleui:

id     role     uiid
1      admin     1
2      admin     2
3      admin     3
4      admin     4
5      admin     5
6      admin     6
7      admin     7
8      admin     8
9      admin     9
public class Demo
{
  public List<Menus> Demos{ get; set; }
}

public class Menus
{
 public int Id { get; set; }
 public string Name { get; set; }
 public int ParentId { get; set; 
 public List<Menus> ChildMenus { get; set; }
}

处理程序代码:

IQueryable data = await UIControlRepository.GetMenusByRoleAsync(request.Role);
            if (data == null)
                return new QueryResponse($"No data exists", false);
            List<Menu> menus = JsonConvert.DeserializeObject<List<Menu>>(JsonConvert.SerializeObject(data));
            Demo demos = new Demo();
            if (menus != null && menus.Count() > 0 && menus.Any(d => d.ParentId == 0)) {
                demos.Demos= new List<Menu>();
                
                demos..AddRange(menus.Where(d => d.ParentId == 0));
                if(demos.Demos != null && demos.Demos.Any())
                {
                    foreach (var menu in demos.Demos)
                    {
                        menu.ChildMenu = new List<Menu>(menus.Where(d => d.ParentId != 0 && d.ParentId == menu.Id));
                                            }


                }
            }
return new QueryResponse() { Data = demos, IsSuccessful = true };
API output:
"demos": [
      {
        "id": 1,
        "name": "Home"
        "parentId": 0,
        "ChildMenu": []
      },
      {
        "id": 2,
        "name": "About",
        "parentId": 0,
        "ChildMenu": [
{
            "id": 4,
            "name": "Department",
            "parentId": 2,
            "ChildMenu": null
          }
,{
            "id": 5,
            "name": "Achievements",
            "parentId": 2,
            "ChildMenu": null
          }]
      },
      {
        "id": 3,
        "name": "ContactUs",
        "parentId": 0,
        "ChildMenu": null
      }
]

I am developing rest API in .net core and dapper ORM framework. My issue is I am trying to retrieve hierarchical menu structure in from database table using linq and pass from API response.
problem is Menu table has 3 levels of menus but only two levels are shown in output, someone please guide me how I can fetch/add/retrieve third level of child menus and return in response instead of null

I have two tables like below:

tblUiComponents :

Id       Name        ParentId
1        Home          0
2        About         0
3        ContactUs     0
4        Department    2
5        Achivements   2
6        CSE           4
7        CIVIL         4 
8        ETC           4
9        MECH          4

tblRoleUi:

id     role     uiid
1      admin     1
2      admin     2
3      admin     3
4      admin     4
5      admin     5
6      admin     6
7      admin     7
8      admin     8
9      admin     9
public class Demo
{
  public List<Menus> Demos{ get; set; }
}

public class Menus
{
 public int Id { get; set; }
 public string Name { get; set; }
 public int ParentId { get; set; 
 public List<Menus> ChildMenus { get; set; }
}

Handler code:

IQueryable data = await UIControlRepository.GetMenusByRoleAsync(request.Role);
            if (data == null)
                return new QueryResponse(
quot;No data exists", false);
            List<Menu> menus = JsonConvert.DeserializeObject<List<Menu>>(JsonConvert.SerializeObject(data));
            Demo demos = new Demo();
            if (menus != null && menus.Count() > 0 && menus.Any(d => d.ParentId == 0)) {
                demos.Demos= new List<Menu>();
                
                demos..AddRange(menus.Where(d => d.ParentId == 0));
                if(demos.Demos != null && demos.Demos.Any())
                {
                    foreach (var menu in demos.Demos)
                    {
                        menu.ChildMenu = new List<Menu>(menus.Where(d => d.ParentId != 0 && d.ParentId == menu.Id));
                                            }


                }
            }
return new QueryResponse() { Data = demos, IsSuccessful = true };
API output:
"demos": [
      {
        "id": 1,
        "name": "Home"
        "parentId": 0,
        "ChildMenu": []
      },
      {
        "id": 2,
        "name": "About",
        "parentId": 0,
        "ChildMenu": [
{
            "id": 4,
            "name": "Department",
            "parentId": 2,
            "ChildMenu": null
          }
,{
            "id": 5,
            "name": "Achievements",
            "parentId": 2,
            "ChildMenu": null
          }]
      },
      {
        "id": 3,
        "name": "ContactUs",
        "parentId": 0,
        "ChildMenu": null
      }
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧时模样 2025-02-01 18:16:52

下面的代码实际上是N_level树。尝试这个:

.//Fetch data and etc
.
.
    Demo demos = new Demo();

    #region Local method 'FillResponseTree()'

    List<Menu> FillResponseTree(List<Menu> menus)
    {
        var node = menus.Select(x => new Menu()
        {
            Id = x.Id,
            ParentId = x.ParentId,
            Name = x.Name,
            ChildMenus = x.ChildMenus != null && x.ChildMenus.Any() ?
            FillResponseTree(x.ChildMenus).ToList()
            : null
        });
        return node.ToList();
    }
    
    #endregion
    
    demos.Demos = FillResponseTree(menus);
   

Below code actually makes n_level tree. Try this one:

.//Fetch data and etc
.
.
    Demo demos = new Demo();

    #region Local method 'FillResponseTree()'

    List<Menu> FillResponseTree(List<Menu> menus)
    {
        var node = menus.Select(x => new Menu()
        {
            Id = x.Id,
            ParentId = x.ParentId,
            Name = x.Name,
            ChildMenus = x.ChildMenus != null && x.ChildMenus.Any() ?
            FillResponseTree(x.ChildMenus).ToList()
            : null
        });
        return node.ToList();
    }
    
    #endregion
    
    demos.Demos = FillResponseTree(menus);
   
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文