在我的架构中,我有以下相关实体:
Basic schema for Element/Folder/User/Role
我正在尝试加载每个用户有权访问的文件夹列表 - 直接或凭借具有可访问该文件夹的角色的用户。我已将需求分为两部分(直接和间接),并使用Union将记录拉回到单个集合中,只需调用一次数据库。
我在下面运行了L2E语句 - 只要用户在Access中有(直接或间接)记录,就会在列表中返回Folder实体(注意:sUserElmKey是当前用户的键)
Dim fldList = (From fld As Folder In ctxClient.Elements.OfType(Of Folder)() _
Join acs As Access In ctxClient.Accesses
On acs.ElementKey Equals fld.ElementKey
Where acs.UserRoleElementKey = sUserElmKey _
Select fld
).Union _
(From fld As Folder In ctxClient.Elements.OfType(Of Folder)() _
Join acs As Access In ctxClient.Accesses
On acs.ElementKey Equals fld.ElementKey
Join rol As Role In ctxClient.Elements.OfType(Of Role)()
On rol.ElementKey Equals acs.UserRoleElementKey
Where (From usr As User In rol.Users
Where usr.ElementKey = sUserElmKey).Any _
Select fld
)
当我只需要知道用户是否可以使用对每个文件夹的任何访问权限时,此工作正常。现在我需要根据用户对每个文件夹具有的AccessTypeCode来定义其他逻辑。
鉴于我需要迭代集合中的结果实体,以便加载表示树UI中节点的不同对象集合,我想我只需在每个子集中添加一个Include(“Accesses”) - 上面的陈述。当我遍历生成的集合时,我可以编写逻辑来为每个新节点对象设置所需的标志(例如,如果用户具有AccessTypeCode“VIEW”,则它们具有只读访问权限;“OWN”或“NEW” “他们有读/写访问权限。”
不幸的是,我还没有找到添加Include来正确执行此操作的位置 - 我将它放在“ctxClient.Elements”之后以及“.OfType(Of Folder()”之后,但是当代码编译并运行时,调试器在迭代时显示每个文件夹下的Accesses集合的0条记录。
重写这个作为lambda表达式是一个选项,但我想我可能只是发现自己在同一个地方。
有关如何解决此问题的任何想法?
答案 0 :(得分:0)
查看您的架构我认为您可以按如下方式重写查询:
(From fld In ctxClient.Elements.OfType(Of Folder)()
Where fld.Accesses.Any(Function(acs) acs.UserRoleElementKey = sUserElmKey)
Select fld)
.Union
(From fld In ctxClient.Elements.OfType(Of Folder)()
Where fld.Accesses.Any(Function(acs) acs.UserRoleElement.Users
.Any(Function(usr) usr.ElementKey = sUserElmKey))
Select fld)
这将直接或通过角色检查是否存在任何访问权限,而无需Include
次访问。