[英]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.