【问题标题】:Inner Join Between Many to Many Relationship Models多对多关系模型之间的内部连接
【发布时间】:2014-04-28 10:13:35
【问题描述】:

我有两个像下面这样配置为多对多关系的模型:

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

如您所见,连接表是内部连接,因此查询按预期工作

感谢任何帮助。

【问题讨论】:

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


    【解决方案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,
                                    ...
                                  })
    

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

    【讨论】:

      【解决方案2】:
      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 };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-12
        • 2021-05-16
        • 2013-05-11
        • 2020-03-27
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多