Иерархический выбор в Entity Framework с лямбда-выражением - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть реляционный набор данных как фиктивный. Я хочу принять данные как иерархические (Role> SubRoles> Permissions), затем я преобразую в JSON, но получаю исключение:

Ошибка CS0266
Невозможно неявно преобразовать тип 'System. Collections.Generi c .IEnumerable 'в' System.Collections.Generi c .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
                      })
                 })
             })
        };
    }

1 Ответ

2 голосов
/ 03 февраля 2020

Вы должны использовать

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

Complete Query

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...