2016-08-09 96 views
0

我有以下型號:多對多關係上的實體框架Linq查詢?

public class ApplicationUser : IdentityUser<string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim> 
{ 
    public bool HasPermission(string permission) 
    { 
     return Roles.Any(r => r.Role.Permissions 
        .Any(p => p.Name == permission)); 
    } 
    // Some other Stuff 

} 

public class ApplicationRole : IdentityRole<string, ApplicationUserRole> 
{ 
    public ApplicationRole(string name) : this() 
    { 
     this.Name = name; 
    } 

    public virtual ICollection<Permission> Permissions { get; set; } 
} 

public class ApplicationUserRole : IdentityUserRole 
{ 
    public ApplicationUserRole(): base() { } 

    public virtual ApplicationRole Role { get; set; } 
} 

public class Permission 
{ 
    public byte Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ApplicationRole> Roles { get; set; } 
} 

基本上他們映射到五個表:用戶,角色的UserRole,權限和RolePermissions - 目前我沒有爲RolePermission的典範 - 我需要一個?

我想使用與lambda表達式LINQ給定用戶的權限列表,類似下面的SQL的東西:

Select p.Id, p.Name 
From Permission p 
inner join RolePermission rp on rp.PermissionId = p.Id 
inner join UserRole ur on ur.RoleId = rp.RoleId 
where ur.UserId = 'xyz' 

我不知道我開始得到一個列表,它的實體使用LINQ的權限 - 我只能使用以下方法設置角色:

var permissions = _context.Users.Where(u => u.Id == userId) 
           .SelectMany(r => r.Roles.SelectMany(p => p.Role.Permissions)) 
           .ToList(); 

任何想法?

+0

也許LinqKit可以幫助你。 http://codigosimples.net/2014/05/09/criando-query-dinamicas-entity-framework-com-linqkit/ – Jhonathan

+0

'SelectMany(r => r.Roles)' –

+0

@Gert'SelectMany( r => r.Roles)'給我一個權限列表? – adam78

回答

0

管理去解決問題如下:

var permissions = _context.Users.Where(u => u.Id == userId) 
          .SelectMany(r => r.Roles.SelectMany(p => p.Role.Permissions)).Distinct().ToList(); 
0

要在Linq中做一個連接,你可以使用類似這樣的東西。

var permissions = new List<Permission>(){ 
        new Permission(){ 
             Id= 1, 
             Name = "Test1" 
            }, 
        new Permission{  Id = 2, 
             Name = "Test2"} 
}; 
var applicationRoles = new List<ApplicationRole>(){ 
         new ApplicationRole{ 
              Id =1, 
              PermissionId = 2 
    }}; 

var x = from p in permissions 
     join ar in applicationRoles on p.Id equals ar.PermissionId 
     select p; 


public class Permission{ 
public byte Id {get;set;} 
public string Name {get;set;} 

public List<ApplicationRole> Roles {get;set;} 
} 


public class ApplicationRole { 
public byte Id {get;set;} 
public byte PermissionId {get;set;} 
} 

我不確定這是你究竟在問什麼,所以我希望它可以幫助你。

+1

需要where子句才能獲得給定用戶的權限? – adam78