多对多关系模型之间的内部连接

本文关键字:内部 连接 模型 关系 之间 | 更新日期: 2023-09-27 18:00:26

我有两个如下的模型,它们被配置为多对多关系:

public class Permission
{
    public int PermissionId { get; set; }
    public string PermissionName { get; set; }
    public virtual List<Role> Roles { get; set; }
}


public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }
    public string ID { get; set; }
    public virtual List<Permission> Permissions { get; set; }
}

我想和林克做一个Inner Join。我可以在SQL中轻松地做到这一点,因为联接表就在那里。但我怎么能和林克一起做到这一点呢?以下是到目前为止我能做的:

  from pr in Permissions
  join role in Roles on pr.Roles.Select(s => s.RoleId).FirstOrDefault() equals role.RoleId
select new { pr.PermissionName, role.RoleId } 

正如您在上面看到的,FirstOrDefault会破坏结果,但除此之外,我无法编译没有错误的查询。

以下是我试图用Linq:编写的查询

 SELECT P.PermissionName, R.RoleId
   FROM Permissions AS P
        INNER JOIN PermissionRoles AS PR ON P.PermissionId = PR.Permission_PermissionId
        INNER JOIN Roles AS R ON PR.Role_RoleId = R.RoleId

正如您所看到的,内部联接是通过联接表进行的,因此查询可以像预期的一样工作

感谢您的帮助。

多对多关系模型之间的内部连接

最简单的语法是

from p in context.Permissions
from r in p.Roles // notice the p !
select new { p.PermissionName, r.RoleId, Role = r.Name, etc... }

EF将生成具有所需内部联接的SQL。

流利的等价物是

Products.SelectMany(p => p.Roles, 
                    (p, r) => new  
                              {
                                p.PermissionName, 
                                r.RoleId,
                                ...
                              })

您可能会同意第一种形式"综合语法"会胜出。

var x = from pr in Permissions
        from role in Roles
        where pr.Roles.Exists(r => r.RoleId == role.RoleId)
        select new { pr.PermissionName, role.RoleId };