2014-04-28 55 views
0

我有一个像下面两型在配置为多对多的关系:内加入很多之间一对多的关系模型

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 to编写查询:

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 

正如你可以看到,内部连接与连接表这样的查询工作正常

任何帮助表示赞赏制成。

回答

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

你可能会认为第一种形式,“综合语法”,胜。

+0

谢谢!你阅读任何有关Linq的精彩内容? – lbrahim

+1

只是MSDN文档,并做了很多:) –

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