簡體   English   中英

EF Core 性能加載大型 object 圖

[英]EF Core performance loading large object graphs

EF Framework 6 中的這段代碼適用於我現有的項目。 更糟的是,它會在一分鍾內返回 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();

我們正在 .NET Core 中重寫此應用程序。 EF Core 6 中的這段代碼的翻譯略有不同,但除了最小的查詢外,它可能需要 10 分鍾才能返回錯誤 temp db out of space。 擴大數據庫 temp db 似乎沒有產生結果,而且空間非常寶貴。 我們認為這不可行。

        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();

任何有關處理此問題的建議都將被接受。 我們經常復制一個花樣,做一個小改動,清除ID值的object(0),然后用新的名字保存。 那么我們如何加載像這樣的“胖”object。 歡迎所有可用的幫助。

您可以使用Split Queries選擇退出為多個包含生成的“一個大查詢”,或者通過手動加載單獨的子圖並讓更改跟蹤器“修復”所有關系,或者通過使用Lazy Loading ,或者根據需要顯式加載導航屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM