【发布时间】:2011-03-14 21:59:59
【问题描述】:
这三种加载方式有什么区别?有人可以举例说明吗?不同的在线资源使用不同的定义,造成不必要的混乱。
【问题讨论】:
标签: entity-framework orm entity-framework-4
这三种加载方式有什么区别?有人可以举例说明吗?不同的在线资源使用不同的定义,造成不必要的混乱。
【问题讨论】:
标签: entity-framework orm entity-framework-4
查询返回对象时,不会同时加载相关对象。
当访问导航属性时,它们会自动加载。也称为“延迟加载”,
【讨论】:
延迟/延迟加载:延迟加载和延迟加载是一回事。关系在第一次访问时被加载。这个想法是,如果不需要数据,则不应加载它。
急切加载:关系与父对象一起获取。这可以更有效地加载数据,但无论正在使用/未使用的数据如何,都会加载数据。
【讨论】:
延迟加载和延迟是同义词(AFAIK,如果我错了,请纠正我)。最大的区别在于 Eager 和 Lazy 之间。 Eager 会预先发生,Lazy 仅在“需要时”发生,执行将发生在 DB 级别——让我们以一个简单的 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()
这是一个急切加载的示例。我们正在招募所有的人,所有的工作,并且我们正在加入记忆。不是很聪明(通常)。这是 Lazy 风格的样子。
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 它,迭代它等)它是懒惰的。还有一些怪癖,但这应该是一本不错的入门书。
【讨论】: