我使用EF Core 2.1,我有一个模型SettingInformation
。 SettingInformation
有一个属性Setting As ICollection(Of Setting)
。
Setting
属性包含多个属性,例如Client As Client
,User as User
和Workspace As Workspace
。这有点复杂。请参阅附图 - 图像。
现在我遇到了问题,我希望获得Settinginformation
的完整信息。
以下代码我必须获取SettingInformation的所有信息
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
好的,这段代码有效,但现在我想重构一下,因为例如,我不需要UserImage
或者' FailedLogins'用户何时使用“LinkedToUser”#39; “协议”的属性'并非一无是处。
我需要的是什么:
我希望所有人都可以帮助我优化这个查询,因为现在我也会为每个设置设置UserImage,这会导致加载时间过长。
编辑:
好的,现在我尝试用EagerLoading做到这一点。但Select会被忽略。但为什么?以下代码:
'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]