Vb.net 使用包含Linq to实体时未加载相关实体

Vb.net 使用包含Linq to实体时未加载相关实体,vb.net,linq,entity-framework,Vb.net,Linq,Entity Framework,在我的模式中,我有以下相关实体: 我正在尝试加载每个用户都有权访问的文件夹列表-直接加载或通过用户拥有对该文件夹的访问权限的角色加载。我将需求分为两部分(直接和间接),并使用一个并集将记录拉回到单个集合中,只需对数据库进行一次调用 我已经运行了下面的L2E语句——只要用户在Access中有一条(直接或间接)记录,文件夹实体就会在列表中返回(注意:suserremkey是当前用户的密钥) 当我只需要知道用户是否可以访问每个文件夹时,这种方法就可以了。现在,我需要根据用户对每个文件夹的Access

在我的模式中,我有以下相关实体:

我正在尝试加载每个用户都有权访问的文件夹列表-直接加载或通过用户拥有对该文件夹的访问权限的角色加载。我将需求分为两部分(直接和间接),并使用一个并集将记录拉回到单个集合中,只需对数据库进行一次调用

我已经运行了下面的L2E语句——只要用户在Access中有一条(直接或间接)记录,文件夹实体就会在列表中返回(注意:suserremkey是当前用户的密钥)

当我只需要知道用户是否可以访问每个文件夹时,这种方法就可以了。现在,我需要根据用户对每个文件夹的AccessTypeCode定义其他逻辑

考虑到我需要迭代集合中的结果实体,以便加载表示树UI中节点的不同对象集合,我想我只需向上面的每个子语句添加一个Include(“access”)。当我遍历生成的集合时,我可以编写逻辑来为每个新节点对象设置所需的标志(例如,如果用户具有AccessTypeCode“VIEW”,则他们具有只读访问权;“OWN”或“new”以及读/写访问权)

不幸的是,我无法找到正确地添加Include的位置—我将它放在了“ctxClient.Elements”以及“.OfType(Of Folder()”)之后,但是当代码编译并运行时,当我迭代时,调试器会在每个文件夹下显示Access集合的0条记录

将其重写为lambda表达式是一种选择,但我想我可能会发现自己处于相同的位置


关于如何解决这个问题有什么想法吗?

看看您的模式,我认为您可以将查询重写如下:

(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)

这将检查是否有任何访问,直接访问或通过角色访问,而无需
包含
访问。

访问
文件夹
的导航属性吗?
访问
元素
的导航属性,它是
文件夹
的超类。上传的架构图片是干净的但是,我看到了两个问题:1)Access.UserRoleElement导航到元素,而不是直接导航到角色,所以我不需要某种方式来表明这一点。用户来自角色,而不是元素?2) 我正在寻找一种方法,以便能够为该用户在Access中包含所有记录(我需要在这种粒度级别上包含这些数据)。如果没有代码库,这真的很难理解。您可以包括一个测试
UserRoleElement
是否是
角色
。看起来您应该能够在
ctxClient.Elements
之后添加
Include(“访问”)
,但显然它不会加载访问。我不明白为什么不。
(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)