【发布时间】:2020-05-07 07:21:31
【问题描述】:
我使用 Entity Framework 6,我目前有一个包含许多包含的查询,它将大约 1200 个实体加载到 dbContext 中。加载实体似乎很慢,因为查询需要将近一分钟。我能对表演做些什么吗?我有 4 个这样的查询需要 2.5 分钟才能加载? LazyLoading 已启用,但出于性能原因,我预加载了实体。
var report = DbContext.REPORT.Single(r => r.ID == reportId);
//this query takes a bit less than 1 minute
DbContext.REPORT_ELEMENT
.Include(re => re.LAYOUT)
.Include(re => re.PAGEMASTER)
.Include(re => re.REPORT_ELEMENTS)
.Include(re => re.SUBTITLE_CONTENT)
.Include(re => re.REPORT_ELEMENT_NOTE)
.Include("SUBTITLE_CONTENT.CONTENT_ELEMENT.LANGUAGE")
.Include("TITLE_CONTENT.CONTENT_ELEMENT.LANGUAGE")
.Where(re => re.REPORT_ID == report.ID)
.Load();
【问题讨论】:
-
考虑添加
AsNotracking() -
另一个选项可能是 EF Core 中的 docs.microsoft.com/en-us/ef/ef6/querying/raw-sql,您可以使用它,然后输入您的输入语句。如果这适用于 EF 中的输入语句,我不确定。
-
您的问题非常广泛,可能适用许多解决方案。通常为了查询性能,您需要在 SQL Server 上打开探查器,假设您正在使用 MSSQL。查看执行计划,然后尝试优化它。此外,延迟加载会降低性能而不是提高性能。索引可能会有所帮助,但在这种情况下我对此表示怀疑。此外,
Select也可能会有所帮助,因为您正在选择要提供的数据。使用分析器检查额外的查询 2.5 分钟是相当多的。 -
@panoskarajohn 我如何指定问题?你需要什么信息?我需要将 coden-p 的包含中列出的所有引用加载到 dbcontext 中,因为我需要它们来编写 xml。如果我一块一块地重新加载它们,整个过程会更慢
-
@CrazyEight 正如我在上面的 cmets 中提到的,查询的分析时间将是一个开始。执行计划将是一个很好的补充。也是。已经提供的答案也是有效的。尝试调试,看看发生了什么。可能有额外的查询正在发生。尝试禁用
Proxies和LazyLoading,看看发生了什么。尝试调查。老实说,这些东西是反复试验。您提到您将所有数据放入 XML 中。您可能需要重新考虑这一点。所有数据都有价值吗?
标签: c# entity-framework-6 dbcontext