Linq 嵌套分组依据以操作标识数据



嗨,几天来我一直在尝试将一种数据结构的形状更改为另一种数据结构,但没有运气。

原始数据结构如下。

public class Role : IdentityRole
{
    public string Name { get; set; }
    public virtual List<PermissionInRole> PermissionsInRole { get; set; }
}
public class PermissionInRole
{
    public Guid Id { get; set; }
    public virtual Permission Permission { get; set; }
    public virtual Feature Feature { get; set; }
}
public class Permission
{
    public Guid Id { get; set; }
    public string Description { get; set; }
}
public class Feature
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual Application Application { get; set; }
}
public class Application
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual List<Feature> Features { get; set; }
}

我想使用 Linq 将其更改为此形状。

public class ApplicationApiModel
{
    public string Name { get; set; }
    public ICollection<FeaturesApiModel> Features { get; set; }
}
public class FeaturesApiModel
{
    public string Name { get; set; }
    public IEnumerable<PermissionsApiModel> Permissions { get; set; } 
}
public class PermissionsApiModel
{
    public string PermissionName { get; set; }
    public IEnumerable<Role> Role { get; set; }
}
public class Role
{
    public string Name { get; set; }
}
我想要一个应用程序集合,其中包含一个

功能集合,其中包含一个权限集合,其中包含具有父权限的角色集合。

我相信这可以用linq完成,但是我没有管理任何帮助会很棒。

经过多次尝试,我最终得到了以下工作代码

            var query = from role in roles
                    group role by role.PermissionsInRole
                        into g
                        select new
                        {
                            PinR = g.Key,
                            role = g.ToList()
                        };
        var transferList = (from w in query
            from pr in w.PinR
            select new
            {
                Feature = pr.Feature, Permission = pr.Permission, TransferRole = w.role.Single()
            })
            .ToList()
            .GroupBy(o => o.Feature, (key, o) =>
            new FeaturesApiModel
            {
                Name = key.Name,
                Permissions = o.GroupBy(transferObject => transferObject.Permission, (subKey,transferObject) =>
                    new PermissionsApiModel
                    {
                        PermissionName = subKey.Description,
                        Role = transferObject.Select(flatTransferObject => new RoleAPIModel {Name = flatTransferObject.TransferRole.Name})
                    }
                )
            });

最新更新