简体   繁体   English

EF Core 性能加载大型 object 图

[英]EF Core performance loading large object graphs

This code from EF Framework 6, works in my existing project. EF Framework 6 中的这段代码适用于我现有的项目。 It returns with the object within a minute at worse:更糟的是,它会在一分钟内返回 object:

        return entityContext
            .StagingPatternSet
            .Include( sp => sp.StagingPatternAccounts ) 
            .Include( sp => sp.StagingPatternAddZeroess )
            .Include( sp => sp.StagingPatternAdditions )
            .Include( sp => sp.StagingPatternEntities )
            .Include( sp => sp.StagingPatternEntities.Select( e => e.StagingPatternAddresses ) )
            .Include( sp => sp.StagingPatternEntities.Select( e => e.StagingPatternAddresses.Select( a => a.StagingPatternAddressFields ) ) )
            .Include( sp => sp.StagingPatternEntities.Select( e => e.StagingPatternMappings ) )
            .Include( sp => sp.StagingPatternEntities.Select( e => e.StagingPatternNames ) )
            .Include( sp => sp.StagingPatternEntities.Select( e => e.StagingPatternNames.Select( n => n.StagingPatternNameFields ) ) )
            .Include( sp => sp.StagingPatternBooleanFieldSelects )
            .Include( sp => sp.StagingPatternBooleanIntegers )
            .Include( sp => sp.StagingPatternCaseNumbers )
            .Include( sp => sp.StagingPatternConcatenates )
            .Include( sp => sp.StagingPatternConcatenates.Select( c => c.StagingPatternConcatenateFields ) )
            .Include( sp => sp.StagingPatternConstants )
            .Include( sp => sp.StagingPatternConstantValues )
            .Include( sp => sp.StagingPatternDateTimes )
            .Include( sp => sp.StagingPatternDelimitedTexts )
            .Include( sp => sp.StagingPatternDelimitedTexts.Select( t => t.StagingPatternDelimitedTextFields ) )
            .Include( sp => sp.StagingPatternDelimitedTexts.Select( t => t.StagingPatternDelimitedTextSummaries ) )
            .Include( sp => sp.StagingPatternDelimitedTexts.Select( t => t.StagingPatternDelimitedTextSummaries.Select(s => s.StagingPatternDelimitedTextSummaryFields) ) )
            .Include( sp => sp.StagingPatternExcels )
            .Include( sp => sp.StagingPatternExtractNumbers )
            .Include( sp => sp.StagingPatternFleetStatements )
            .Include( sp => sp.StagingPatternFwTexts )
            .Include( sp => sp.StagingPatternFwTexts.Select( f => f.StagingPatternFwTextFields ) )
            .Include( sp => sp.StagingPatternFwTexts.Select( f => f.StagingPatternFwTextSummaries ) )
            .Include( sp => sp.StagingPatternFwTexts.Select( f => f.StagingPatternFwTextSummaries.Select( s => s.StagingPatternFwTextSummaryFields ) ) )
            .Include( sp => sp.StagingPatternIbmDecimals )
            .Include( sp => sp.StagingPatternImpliedDecimals )
            .Include( sp => sp.StagingPatternMultiRowTexts )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextLines ) )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextLines.Select( k => k.StagingPatternMultiRowTextKeys ) ) )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextLines.Select( f => f.StagingPatternMultiRowTextLineFields ) ) )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextSorts ) )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextSummaries ) )
            .Include( sp => sp.StagingPatternMultiRowTexts.Select( l => l.StagingPatternMultiRowTextSummaries.Select( f => f.StagingPatternMultiRowTextSummaryFields ) ) )
        .Include( sp => sp.StagingPatternNumberFormats )
        .Include( sp => sp.StagingPatternNumerics )
            .Include( sp => sp.StagingPatternNumerics.Select( f => f.StagingPatternNumericFields ) )
            .Include( sp => sp.StagingPatternRedactSsns )
            .Include( sp => sp.StagingPatternReplaceSubstrings )
            .Include( sp => sp.StagingPatternSplitStrings )
            .Include( sp => sp.StagingPatternSsns )
            .Include( sp => sp.StagingPatternStrips )
            .Include( sp => sp.StagingPatternStripToNumericStrings )
            .Include( sp => sp.StagingPatternSubstrings )
            .Include( sp => sp.StagingPatternTranspositions )
            .Include( sp => sp.StagingPatternTranspositions.Select( v => v.StagingPatternTranspositionValues ) )
            .Include( sp => sp.StagingPatternVirtuals )
        .Include( sp => sp.StagingIoLiteUiManagements  )
            .Include( sp => sp.StagingPatternVirtuals.Select( f => f.StagingPatternVirtualFields ) )
            .Where( s => s.StagingPatternId == stagingPatternId ).ToFullyLoaded();

We're doing a re-write for this app in .NET Core.我们正在 .NET Core 中重写此应用程序。 This code in EF Core 6, translates a little differently, but on any but the smallest queries, it may take 10 minutes when it returns an error temp db out of space. EF Core 6 中的这段代码的翻译略有不同,但除了最小的查询外,它可能需要 10 分钟才能返回错误 temp db out of space。 Enlarging the database temp db does not seem to yield results, and space is at a premium.扩大数据库 temp db 似乎没有产生结果,而且空间非常宝贵。 We don't find this viable.我们认为这不可行。

        var pattern = entityContext
            .StagingPatternSet
            .Include(sp => sp.StagingIoLiteUiManagements)
            .Include(sp => sp.StagingPatternAccounts)
            .Include(sp => sp.StagingPatternAddZeroess)
            .Include(sp => sp.StagingPatternAdditions)
            .Include(sp => sp.StagingPatternEntities)
            .Include(sp => sp.StagingPatternEntities).ThenInclude(e => e.StagingPatternAddresses).ThenInclude(a => a.StagingPatternAddressFields)
            .Include(sp => sp.StagingPatternEntities).ThenInclude(e => e.StagingPatternMappings)
            .Include(sp => sp.StagingPatternEntities).ThenInclude(e => e.StagingPatternNames).ThenInclude(n => n.StagingPatternNameFields)
            .Include(sp => sp.StagingPatternBooleanFieldSelects)
            .Include(sp => sp.StagingPatternBooleanIntegers)
            .Include(sp => sp.StagingPatternCaseNumbers)
            .Include(sp => sp.StagingPatternConcatenates)
            .Include(sp => sp.StagingPatternConcatenates).ThenInclude(c => c.StagingPatternConcatenateFields)
            .Include(sp => sp.StagingPatternConstants)
            .Include(sp => sp.StagingPatternConstantValues)
            .Include(sp => sp.StagingPatternDateTimes)
            .Include(sp => sp.StagingPatternDelimitedTexts)
            .Include(sp => sp.StagingPatternDelimitedTexts).ThenInclude(t => t.StagingPatternDelimitedTextFields)
            .Include(sp => sp.StagingPatternDelimitedTexts).ThenInclude(t => t.StagingPatternDelimitedTextSummaries).ThenInclude(s => s.StagingPatternDelimitedTextSummaryFields)
            .Include(sp => sp.StagingPatternExcels)
            .Include(sp => sp.StagingPatternExtractNumbers)
            .Include(sp => sp.StagingPatternFleetStatements)
            .Include(sp => sp.StagingPatternFwTexts)
            .Include(sp => sp.StagingPatternFwTexts).ThenInclude(f => f.StagingPatternFwTextFields)
            .Include(sp => sp.StagingPatternFwTexts).ThenInclude(f => f.StagingPatternFwTextSummaries).ThenInclude(s => s.StagingPatternFwTextSummaryFields)
            .Include(sp => sp.StagingPatternIbmDecimals)
            .Include(sp => sp.StagingPatternImpliedDecimals)
            .Include(sp => sp.StagingPatternMultiRowTexts)
            .Include(sp => sp.StagingPatternMultiRowTexts).ThenInclude(l => l.StagingPatternMultiRowTextLines).ThenInclude(k => k.StagingPatternMultiRowTextKeys)
            .Include(sp => sp.StagingPatternMultiRowTexts).ThenInclude(l => l.StagingPatternMultiRowTextLines).ThenInclude(f => f.StagingPatternMultiRowTextLineFields)
            .Include(sp => sp.StagingPatternMultiRowTexts).ThenInclude(l => l.StagingPatternMultiRowTextSorts)
            .Include(sp => sp.StagingPatternMultiRowTexts).ThenInclude(l => l.StagingPatternMultiRowTextSummaries).ThenInclude(f => f.StagingPatternMultiRowTextSummaryFields)
            .Include(sp => sp.StagingPatternNumberFormats)
            .Include(sp => sp.StagingPatternNumerics).ThenInclude(f => f.StagingPatternNumericFields)
            .Include(sp => sp.StagingPatternRedactSsns)
            .Include(sp => sp.StagingPatternReplaceSubstrings)
            .Include(sp => sp.StagingPatternSplitStrings)
            .Include(sp => sp.StagingPatternSsns)
            .Include(sp => sp.StagingPatternStrips)
            .Include(sp => sp.StagingPatternStripToNumericStrings)
            .Include(sp => sp.StagingPatternSubstrings)
            .Include(sp => sp.StagingPatternTranspositions).ThenInclude(v => v.StagingPatternTranspositionValues)
            .Include(sp => sp.StagingPatternVirtuals).ThenInclude(f => f.StagingPatternVirtualFields)
            .Where(s => s.StagingPatternId == stagingPatternId);

        var patternArray = await pattern.ToArrayAsync();
        return patternArray.ToList();

Any advise on handling this would be accepted.任何有关处理此问题的建议都将被接受。 We often copy a pattern, make a small change, clear the object of ID values (0) and then save with a new name.我们经常复制一个花样,做一个小改动,清除ID值的object(0),然后用新的名字保存。 So how do we load a 'fat' object such as this.那么我们如何加载像这样的“胖”object。 All usable help welcome.欢迎所有可用的帮助。

You can opt out of the "one-big-query" generated for multiple includes with either Split Queries , or by manually loading separate sub-graphs and letting the change tracker "fix up" all the relationships, or by using Lazy Loading , or Explicitl Loading Navigation Properties as needed.您可以使用Split Queries选择退出为多个包含生成的“一个大查询”,或者通过手动加载单独的子图并让更改跟踪器“修复”所有关系,或者通过使用Lazy Loading ,或者根据需要显式加载导航属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM