C# 使用Linq to Entities获取用户通过自联接拥有的角色列表

C# 使用Linq to Entities获取用户通过自联接拥有的角色列表,c#,sql,linq-to-entities,asp.net-mvc-5,asp.net-identity,C#,Sql,Linq To Entities,Asp.net Mvc 5,Asp.net Identity,我正在尝试构建一个动态菜单,它使用Identity 2.0角色定义用户应该看到的菜单项。我对C#很陌生,需要一些帮助 就我所做的而言,我认为角色是一个菜单项,用户可以看到或不看到它,这取决于分配给他们的角色。我有两个级别的菜单项-父菜单项(如“报告”和子菜单项(如“订单报告”、“收货报告”等) 因此,我的ApplicationRole类如下所示: public string Description { get; set; } public string MenuTitle {get;set;}

我正在尝试构建一个动态菜单,它使用Identity 2.0角色定义用户应该看到的菜单项。我对C#很陌生,需要一些帮助

就我所做的而言,我认为角色是一个菜单项,用户可以看到或不看到它,这取决于分配给他们的角色。我有两个级别的菜单项-父菜单项(如“报告”和子菜单项(如“订单报告”、“收货报告”等)

因此,我的
ApplicationRole
类如下所示:

public string Description { get; set; }
public string MenuTitle {get;set;}
public string MenuIcon { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }

public virtual ApplicationRole ParentRole { get; set; }
我将只针对用户存储角色,其中ParentRole不为null。我想知道如何为登录用户检索此角色列表并呈现菜单

所以,逻辑是这样的:

  • 获取用户为其分配的所有菜单项(角色)的列表
  • 使用此列表,使用
    ParentRole
    获取父角色的不同列表(菜单的顶层)
  • 使用这两个列表,在下面填充我的视图模型:

    public class NavigationViewModel
    {
    public int MenuId { get; set; }
    public string MenuName { get; set; }
    public string ControllerName { get; set; }
    public string ActionName { get; set; }
    public string MenuIcon { get; set; }
    public IEnumerable<NavigationViewModel> ChildMenuItems { get; set; }
    }
    
    公共类导航视图模型
    {
    public int MenuId{get;set;}
    公共字符串菜单名{get;set;}
    公共字符串控制器名称{get;set;}
    公共字符串ActionName{get;set;}
    公共字符串MenuIcon{get;set;}
    公共IEnumerable ChildMenuItems{get;set;}
    }
    
  • 基本上,我正在创建一个包含顶级菜单和子菜单的菜单

    我的问题是,我真的不知道从哪里开始查询数据库。 理想情况下,我想要一个对角色表进行自联接的查询,以在同一个查询中获取父角色,但是我对C#和Linq是全新的,不知道从哪里开始


    任何建议都很好。

    我的建议是向项目中添加一个
    ADO.NET实体数据模型
    ,并从数据库中添加要查询的表。然后创建一个
    .edmx
    文件,其中包含表及其关系,您可以在代码中访问它们(一个
    DbContext
    是用您的数据库名创建的,就像
    YouDBNameEntities

    现在已连接到数据库,请创建一个新上下文:

    YourDBNameEntities上下文=新建YourDBNameEntities()

    之后,您可以在添加的表上进行联接,在您的情况下,可以进行自联接:

    var Query=context.AddedTable.Join(context.AddedTable,…)

    var Query=来自context.AddedTable中的yourClassName1

             join yourClassName2 in context.AddedTable on yourClass1.ID equals yourClass2.ID
    
             where !yourClassName1.ParentRole.equals(null)
    
             select new { ParentRole = yourClassName1.ParentRole }