使用关键字与查询查找实体时的急切加载

本文关键字:加载 实体 查找 关键字 查询 | 更新日期: 2023-09-27 18:27:16

使用键(如下所示)查找实体是否会急切地隐式加载所有相关实体?

var person = context.People.Find(1);

假设People实体具有相关的Children实体,它们会在上面的查找中被急切地加载,还是下面的查询更合适?

var person = context.People.Include("Children").First(p => p.Id == 1);

如果使用Find没有急切地加载Children实体,并且必须再次命中数据库才能获取它们(我认为),那么哪种方法可能性能更好?

同样,如果Find方法没有急切地加载Children实体,那么加载它们的正确方法是什么?

最后,在使用Find时,是否有一些配置会导致Children甚至所有相关实体被急切地加载?

使用关键字与查询查找实体时的急切加载

以下是您关于Find方法的问题的答案。实体框架代码优先查找与SingleOrDefault(热切加载)

如果Children实体没有使用Find急切地加载,并且必须再次命中数据库才能获取它们(我认为),那么哪种方法可能性能更好?

一般来说,使用SQL,批量加载数据更快,如果EF必须根据ID加载子实体,它将向DB提交每个实体的查询,而不是批量加载,或者它可能使用WHERE ID in(1,2,3,4,5)。无论哪种方式,这都比在子表上加载带有联接的实体要慢,因此热切加载应该更快,但这完全取决于EF生成的查询和数据库模式。

实现这一点的最佳方法是对SQL服务器进行概要分析,以查看EF生成了哪些查询,然后生成一个复制这些查询的脚本并为脚本计时。