我刚刚将EF core 2.2.6迁移到3.1,并且在使用更多include语句时遇到超时问题,如下所示:
var z = await _context.PortfolioCompany
.Include(x => x.val).ThenInclude(x => x.valft)
.Include(x => x.val).ThenInclude(x => x.ipv)
.Include(x => x.up)
.Include(x => x.pcf)
.Include(b => b.pcl)
.SingleOrDefaultAsync(p => p.DealCode.ToUpper() == dealCode.ToUpper(), cancellationToken);
请提出如何解决此问题的建议。在EF core 2.2.6中使用相同的查询时,它工作正常,但现在我遇到了超时问题
https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes说,使用多个include语句会显示超时错误,但不确定如何解决?这不是ef core 2.2.6的问题
答案 0 :(得分:0)
如果您在SQL Server中使用默认设置,则查询应该不区分大小写。因此,您不需要使用.ToUpper()
。同样,这样做可能会阻止查询使用正确的索引。我假设您的dealCode
列上有正确的索引以及外键?尝试删除.ToUpper()
调用,看看查询运行是否更快。
更新根据您的链接,解决方法似乎是将查询分解为多个查询,然后将其拼接到内存中,如下所示:https://github.com/dotnet/efcore/issues/18017#issuecomment-535763068
答案 1 :(得分:0)
在处理大型数据结构时,要考虑的第一个问题是“我是否需要所有这些数据?”例如,您可以使用Select
仅从相关表中检索详细信息,并让EF建立更合适的查询,而不是尝试从所有关联表中拉回所有列吗?
此查询在EF Core 2.2中运行需要多长时间?
我的建议是查看关联的表,看看哪些表可能包含很多列或任何特别大的列。 (MEMO,VARCHAR(Max)之类的东西)如果您有选择地消除表,是否会因为出现较大的延迟而引起怀疑?
例如,如果要排除.Include(x => x.pcf)
,并且所有内容加载都没有超时。您可以通过发出以下命令在使用PCF之前先提取它:
_context.Entry(z).Reference(x => x.pcf).Load();
尽管此查询是将数据返回到视图等。我强烈建议根据视图的需求创建视图模型结构,并使用Select
填充它,而不是急于加载整个实体图。如果您打算加载一个实体以应用更新,那么我倾向于只急于加载最常用的更新表,并在需要时让EF延迟加载其余表,或者利用Load
方法如果需要获取。