Entity framework中的延迟加载、延迟加载和急切加载

10
这三种类型的加载有什么区别?可以通过例子来解释吗?网上不同的资源使用不同的定义,造成了比必要更多的混乱。
3个回答

9

延迟加载(Lazy loading)和推迟加载(Deferred)在IT技术中基本上是同义词(据我所知,请纠正我如果我错了)。两者的主要区别在于急切加载(Eager)和惰性加载(Lazy)。急切加载会在前台立即执行,而惰性加载则只会在需要时才执行,并且执行会在数据库层面上进行。让我们以一个简单的JOIN语句为例。

var people = (from p in people SELECT p).ToList();
var jobs = (from j in jobs SELECT j).ToList();

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()

这是一种急切加载的示例。我们正在获取所有人员,所有工作,并在内存中执行连接。这通常不是明智的做法。以下是懒惰加载的样式。

var people = (from p in people SELECT p);
var jobs = (from j in jobs SELECT j);

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()

这段代码创建了一个IQueryable,包括人和工作两个表(IQueryable是延迟加载的),并在数据库中进行连接操作。这样可以减少网络活动,并且通常比较快,因为数据库优化了连接等操作。除非我们明确地说“我需要那些数据!”(通过ToListing、迭代等方式),否则它是延迟加载的。还有一些细节问题,但这应该是一个不错的入门指南。

请注意,以下是一段关于编程的内容。由于直接从脑海中提取,所以语法可能不完全准确,请见谅。 - Mike M.
根据您的示例,一旦执行ToList,它会进行急切加载,因为它会进行数据库查询以获取数据。因此,它似乎更像是一种编程风格。但是,使用EF,可以在上下文选项中设置LazyLoading为true或false。那么这如何适用呢? - DotnetDude
EF4关闭LazyLoading后,您需要使用People.Include("Jobs")来获取工作记录(假设Jobs是与People相关联的外键)。开启LazyLoading后,该数据将在需要时返回。例如,当您说People.Jobs.ToList()时。 - Mike M.

3

惰性/延迟加载: 惰性加载和延迟加载是同一件事。当首次访问关系时,它才会被加载。这个想法是如果数据不是必需的,就不应该被加载。

急切加载: 关系与父对象一起获取。 这样可以更有效地加载数据,但会加载数据,无论数据是否被使用或未使用。


0

当查询返回对象时,相关的对象不会同时被加载。

相反,当访问导航属性时,它们会自动加载。也被称为“延迟加载”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接