多对多关系模型之间的内在联系

时间:2014-04-28 10:13:35

标签: c# sql linq ef-code-first

我有两个类似下面的模型,它们配置为多对多的关系:

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

我想和Linq一起做Inner Join。我可以在SQL中轻松完成,因为连接表存在于那里。但是我怎么能用linq做到这一点?以下是我到目前为止所能做的:

  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

如您所见,使用连接表进行内连接,因此查询按预期工作

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

最简单的语法是

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,
                                ...
                              })

您可能会同意第一种形式“综合语法”获胜。

答案 1 :(得分:0)

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