使用Include with Linq to Entities时未加载的相关实体

时间:2013-12-05 20:16:58

标签: vb.net linq entity-framework

在我的架构中,我有以下相关实体:

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表达式是一个选项,但我想我可能只是发现自己在同一个地方。

有关如何解决此问题的任何想法?

1 个答案:

答案 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次访问。