簡體   English   中英

實體框架Linq查詢多對多關系嗎?

[英]Entity Framework Linq Query on a Many to Many Relationship?

我有以下型號:

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; }
}

基本上,它們映射到五個表:Users,Roles,UserRoles,Permissions和RolePermissions-當前我沒有RolePermission模型-我需要一個嗎?

我想使用linq和lambda表達式獲取給定用戶的權限列表,類似於以下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();

有任何想法嗎?

要在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;}
}

我不確定這是否是您真正要問的,所以希望對您有所幫助。

設法將其解決如下:

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

暫無
暫無

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

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