Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net EF Core-选择“包括”,然后选择“包括”_Vb.net_Entity Framework Core - Fatal编程技术网

Vb.net EF Core-选择“包括”,然后选择“包括”

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

我使用的是EF Core 2.1,我有一个模型
设置信息
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-谢谢-完成