使用关键字与查询查找实体时的急切加载
本文关键字:加载 实体 查找 关键字 查询 | 更新日期: 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生成了哪些查询,然后生成一个复制这些查询的脚本并为脚本计时。