多对多关系模型之间的内部连接
本文关键字:内部 连接 模型 关系 之间 | 更新日期: 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 };