【发布时间】:2019-11-14 19:27:06
【问题描述】:
我有以下对象结构(简化了一点......),其中一个用户被赋予一个角色,该角色属于一个或多个组,并且每个组都有一组权限(带有名称)。由于一个权限可以属于多个组,一个组可以包含多个角色,所以结构是这样的:
用户 -> 角色 ->> RoleToGroup -> 组 ->> GroupToPrivilege -> 特权(->> = 列表):
我需要找出是否有任何用户拥有名为“name”的权限。
我尝试了下面的 Linq 语句,我认为它会给我正确的答案:
DbContext.RootObject.Where (x => x.Role.RoleToGroup.Any(y => y.Group.GroupToPrivilege.Any(z=> z.Privilege.Name == "Name")))
这给出了以下 sql:
SELECT
"Extent1"."ROLE_ID" AS "ROLE_ID",
FROM "USER" "Extent1"
WHERE ( EXISTS (SELECT
1 AS "C1"
FROM ( SELECT
"Extent2"."GROUPS_ID" AS "GROUPS_ID"
FROM "ROLETOGROUP" "Extent2"
WHERE ("Extent1"."ROLE_ID" = "Extent2"."ROLE_ID")
) "Project1"
WHERE ( EXISTS (SELECT
1 AS "C1"
FROM "GROUPTOPRIVILEGE" "Extent3"
INNER "PRIVILEGE" "Extent4" ON "Extent3"."PRIVILEGES_ID" = "Extent4"."ID"
WHERE (("Project1"."GROUPS_ID" = "Extent3"."GROUP_ID") AND ('Name' = "Extent4"."NAME"))
))
))
运行时出现以下错误:
ORA-00904:“Extent1”。“ROLE_ID”:标识符无效
如果我删除查询的“Exten1”部分,它运行正常:
SELECT
"Extent1"."ROLE_ID" AS "ROLE_ID",
FROM "USER" "Extent1"
WHERE ( EXISTS (SELECT
1 AS "C1"
FROM ( SELECT
"Extent2"."GROUPS_ID" AS "GROUPS_ID"
FROM "ROLETOGROUP" "Extent2"
WHERE ("ROLE_ID" = "Extent2"."ROLE_ID")
) "Project1"
WHERE ( EXISTS (SELECT
1 AS "C1"
FROM "GROUPTOPRIVILEGE" "Extent3"
INNER "PRIVILEGE" "Extent4" ON "Extent3"."PRIVILEGES_ID" = "Extent4"."ID"
WHERE (("Project1"."GROUPS_ID" = "Extent3"."GROUP_ID") AND ('Name' = "Extent4"."NAME"))
))
))
但是我怎样才能让 Entity Framework 用 Linq 做同样的事情呢?
【问题讨论】:
标签: c# oracle entity-framework linq