2014-12-15 2 views
2

Привет, я пытаюсь изменить форму одной структуры данных на другую в течение нескольких дней без везения.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, однако мне не удалось помочь.

ответ

1

После многих попыток я закончил с следующим рабочим кодом

  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}) 
        } 
       ) 
      }); 
Смежные вопросы