我有五个表都带有ID
的主键我目前正在使用存储过程中的以下查询获取所选用户的权限
SELECT DISTINCT
tbl_Right.ID, tbl_Right.Name
FROM
tbl_User_Role_Relation
INNER JOIN
tbl_Role_Right_Relation ON tbl_User_Role_Relation.Role_ID = tbl_Role_Right_Relation.Role_ID
INNER JOIN
tbl_Right ON tbl_Role_Right_Relation.Right_ID = tbl_Right.ID
WHERE
tbl_User_Role_Relation.User_ID = @User_ID
我试图用这段代码将其转换为LINQ to Entity
var query = from r in context.Rights
from rrr in r.Role_Right_Relation
from rl in rrr.Role
from urr in rl.User_Role_Relation
where urr.User_ID == userid
select r;
但是我收到以下错误
源类型为“System.Linq.IQueryable”的查询表达式中的后续from子句中不允许使用类型为“Models.Role”的表达式在调用“SelectMany”时类型推断失败
任何建议都会有所帮助。
感谢。
答案 0 :(得分:2)
首先,linq查询正在进行交叉连接,而不是像sql那样的内部连接。你应该看看this
其次,您可能最好正确定义edmx中实体之间的关系,您可能根本不需要加入,而是可以使用navigation properites访问父/子并过滤那些属性直接
实体框架的想法是你不必平铺层次结构
答案 1 :(得分:0)
编辑3
如果您逐字发布了代码,那么您就错过了一行
from u in urr.Users
所以:
var query = from r in context.Rights
from rrr in r.Role_Right_Relation
from rl in rrr.Role
from urr in rl.User_Role_Relation
from u in urr.Users
where u.User_ID == userid
select r;
或者至少有一个拼写错误,应该在哪里阅读:
where urr.User_ID == userid
导致:
var query = from r in context.Rights
from rrr in r.Role_Right_Relation
from rl in rrr.Role
from urr in rl.User_Role_Relation
where urr.User_ID == userid
select r;
答案 2 :(得分:0)
如果您使用方法语法,您应该能够执行以下操作:
var user = context.Users.FirstOrDefault(u => u.Id == userId);
var rights =user.Roles.SelectMany(role => role.Rights).Distinct();
在获得权利之前,请务必检查用户是否为空