簡體   English   中英

使用 lambda 表達式在實體框架中進行分層選擇

[英]Hierarchical select in Entity Framework with lambda expression

我有一個關系數據集作為虛擬數據。 我想將數據作為層次結構(角色 > 子角色 > 權限),然后我將轉換為 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
                      })
                 })
             })
        };
    }

你應該使用

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()

Permissions 是一個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()
        };

另請注意,Role 表示單個實體,而查詢返回一個集合。 您需要選擇需要存儲集合中的哪個實體。 對於上面的示例代碼,我使用了First()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM