EF Core - 选择包含然后包含

时间:2018-03-18 11:52:38

标签: vb.net entity-framework-core

我使用EF Core 2.1,我有一个模型SettingInformationSettingInformation有一个属性Setting As ICollection(Of Setting)Setting属性包含多个属性,例如Client As ClientUser as UserWorkspace As Workspace。这有点复杂。请参阅附图 - 图像。

Model-Diagram(Part of it)

现在我遇到了问题,我希望获得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; “协议”的属性'并非一无是处。

我需要的是什么:

  • 完整的设置信息' - 好的
  • '设置'来自'设置信息' (ICollection) - 好的我可以使用Include但在'设置':
    • 只有' UserName',' FirstName'和'姓氏'来自'用户'如果'用户'不是什么
    • 只有' ClientShortName'和' ClientLongName' ' LinkedToClient'如果'客户不是什么
    • 只有' WorkspaceName'和' WorkspaceLocation' '工作区'识别工作区'不是没什么。

我希望所有人都可以帮助我优化这个查询,因为现在我也会为每个设置设置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]

0 个答案:

没有答案