Vb.net EF Core-选择“包括”,然后选择“包括”
我使用的是EF Core 2.1,我有一个模型Vb.net EF Core-选择“包括”,然后选择“包括”,vb.net,entity-framework-core,Vb.net,Entity Framework Core,我使用的是EF Core 2.1,我有一个模型设置信息。SettingInformation的属性设置为ICollection(Of Setting)。 设置属性有几个属性,如客户机作为客户机,用户作为用户,以及工作区作为工作区。这有点复杂。请参阅附图 现在我的问题是,我想获得设置信息的完整信息。 下面的代码我必须得到一个设置信息的所有信息 Public Async Function GetCompleteSettingInformations(settingInfoId As Integer
设置信息
。SettingInformation
的属性设置为ICollection(Of Setting)
。
设置
属性有几个属性,如客户机作为客户机
,用户作为用户
,以及工作区作为工作区
。这有点复杂。请参阅附图
现在我的问题是,我想获得设置信息的完整信息。
下面的代码我必须得到一个设置信息的所有信息
Public Async Function GetCompleteSettingInformations(settingInfoId As Integer) As Task(Of SettingInformation)
Dim q As IQueryable(Of SettingInformation) = GetSettingInfoDefaultQuery()
q = q.Where(Function(s) s.SettingInformationId = settingInfoId)
q = q.Include(Function(i) i.Settings).ThenInclude(Function(i) i.User) _
.Include(Function(i) i.Settings).ThenInclude(Function(i) i.Workspace) _
.Include(Function(i) i.Settings).ThenInclude(Function(i) i.Client) _
.Include(Function(i) i.Protocol)
Dim ret = Await q.SingleOrDefaultAsync
Return ret
End Function
好的,这段代码可以工作,但现在我想重构它,因为例如,当“协议”的“LinkedToUser”属性不是空时,我不需要用户的UserImage
或“FailedLogins”
我需要的是:
- 完整的“设置信息”-很简单
- “设置信息”(ICollection)中的“设置”-好的,我可以通过“设置”中的“包含”来获取此信息:
- 如果“User”不是空的,则仅“User”中的“UserName”、“FirstName”和“LastName”
- 只有'LinkedToClient'的'ClientShortName'和'ClientLongName'如果'Client'不是空的
- 只有'Workspace'id的'WorkspaceName'和'WorkspaceLocation'是'Workspace'不是空的
我希望这里的任何人都能帮助我优化这个查询,因为现在我还为每个设置设置了一个用户图像,这会导致很长的加载时间
编辑:
好的,现在我已经试着用这个方法了。但是选择被忽略。但是为什么呢?以下代码:
'Alle WorkspaceIDs ermitteln für welche es Settingmodifikationen gibt
Dim wsIds As List(Of Integer) = ret.Settings.Where(Function(u) u.WorkspaceId.HasValue).Select(Function(u) u.WorkspaceId.Value).ToList
Await ContextInternal.Workspaces.Where(Function(u) wsIds.Contains(u.WorkspaceId)) _
.Select(Function(su) New Workspace() With {.WorkspaceName = su.WorkspaceName, .WorkspaceLocation = su.WorkspaceLocation, .WorkspaceDesciption = su.WorkspaceDesciption, .WorkspaceId = su.WorkspaceId, .Settings = su.Settings}).AsTracking.LoadAsync
加载协议中相关的所有工作区。我将只获取列ID、描述、位置和名称。但是我得到了所有的专栏?
生成以下SQL:
SELECT [u].[WorkspaceId],
[u].[CreatedBy],
[u].[CreatedOn],
[u].[CreationTimestamp],
[u].[DeletedFlag],
[u].[DeletedTimestamp],
[u].[LastUpdateBy],
[u].[LastUpdateOn],
[u].[LastUpdateTimestamp],
[u].[WorkspaceDesciption],
[u].[WorkspaceLastOnline],
[u].[WorkspaceLocation],
[u].[WorkspaceLocked],
[u].[WorkspaceName]
FROM [Workspaces] AS [u]
WHERE [u].[WorkspaceId] IN (1)
ORDER BY [u].[WorkspaceId]
很抱歉上面的代码有点错误。我不需要所有的包裹。我只需要以下内容:'q=q.Include(Function(I)I.Settings).然后Include(Function(I)I.User).Include(Function(I)I.Settings).然后Include(Function(I)I.Workspace).包括(Function(I)I.Settings).然后Include(Function(I)I.Client).包括(Function(I)I.Protocol)'请编辑您的问题并输入正确的编码。不支持条件包含。您最好在以后有条件地加载相关数据。@binaryfunt-谢谢-完成