具有lambda表达式的实体框架中的分层选择

问题描述 投票:0回答:1

我有一个关系数据集作为虚拟对象。我想将数据作为分层结构(角色>子角色>权限),然后将其转换为JSON,但出现异常:

错误CS0266无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.List'。存在显式转换(您是否缺少演员表?)

感谢您的回答。

模型类:

    public class Role
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<SubRole> SubRoles { get; set; }
    }

    public class SubRole
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string EndPoint { get; set; }
        public List<Permission> Permissions { get; set; }
    }

    public class RoleSubRole
    {
        public int Id { get; set; }
        public int RoleId { get; set; }
        public int SubRoleId { get; set; }
    }

    public class Permission
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class SubRolePermission
    {
        public int Id { get; set; }
        public int SubRoleId { get; set; }
        public int PermiisonId { get; set; }
    }

    public class RoleModel
    {
        public Role Role { get; set; }
    } 

程序类:

    public static void Main(string[] args)
    {
        RoleModel roleModel = new RoleModel()
        {
            Role =
            (from u in DataSet.Users
             join r in DataSet.Roles on u.RoleId equals r.Id
             where u.Id == 1
             select new Role
             {
                 Name = r.Name,
                 SubRoles =
                 (from rsb in DataSet.RoleSubRoles
                 join sr in DataSet.SubRoles on rsb.SubRoleId equals sr.Id
                 where r.Id == rsb.RoleId
                 select new SubRole
                 {
                      Name = sr.Name,
                      EndPoint = sr.EndPoint,
                      Permissions =
                      (from srp in DataSet.SubRolePermissions
                      join p in DataSet.Permissions on srp.PermiisonId equals p.Id
                      where srp.SubRoleId == sr.Id
                      select new Permission
                      {
                          Name = p.Name
                      })
                 })
             })
        };
    }
c# entity-framework linq lambda rbac
1个回答
2
投票

您应该使用

Permissions =
                      (from srp in DataSet.SubRolePermissions
                      join p in DataSet.Permissions on srp.PermiisonId equals p.Id
                      where srp.SubRoleId == sr.Id
                      select new Permission
                      {
                          Name = p.Name
                      }).ToList()

权限是List<T>,而查询返回的是IEnumerable<T>。 SubRoles也是如此。您需要转换为List<T>,这可以使用ToList()方法来完成

完整查询

Role =
            (from u in DataSet.Users
             join r in DataSet.Roles on u.RoleId equals r.Id
             where u.Id == 1
             select new Role
             {
                 Name = r.Name,
                 SubRoles =
                 (from rsb in DataSet.RoleSubRoles
                 join sr in DataSet.SubRoles on rsb.SubRoleId equals sr.Id
                 where r.Id == rsb.RoleId
                 select new SubRole
                 {
                      Name = sr.Name,
                      EndPoint = sr.EndPoint,
                      Permissions =
                      (from srp in DataSet.SubRolePermissions
                      join p in DataSet.Permissions on srp.PermiisonId equals p.Id
                      where srp.SubRoleId == sr.Id
                      select new Permission
                      {
                          Name = p.Name
                      }).ToList()
                 }).ToList()
             }).First()
        };

还请注意,角色代表单个实体,而查询返回一个集合。您需要选择需要存储集合中的哪个实体。对于上面的示例代码,我使用了First()

© www.soinside.com 2019 - 2024. All rights reserved.