使用 lambda 表达式的 Entity Framework 中的分层 select

Hierarchical select in Entity Framework with lambda expression

我有一个关系数据集作为虚拟数据集。我想将数据作为层次结构(角色 > 子角色 > 权限)然后我将转换为 JSON 但我得到一个例外:

Error CS0266
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.List'. An explicit conversion exists (are you missing a cast?)

感谢您的回答。

型号classes:

    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; }
    } 

计划class:

    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
                      })
                 })
             })
        };
    }

你应该使用

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>,而查询 returns 是 IEnumerable<T>。 SubRoles.You 需要转换为 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()
        };

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