我有两个类似下面的模型,它们配置为多对多的关系:
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
如您所见,使用连接表进行内连接,因此查询按预期工作
感谢任何帮助。
答案 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 };