2009-09-17 190 views
0

我有一个复杂的对象,当我使用没有包含语法的linq查询时,我仍然将所有相关实体返回到我的对象图中。你可以解释一下吗?Linq to Entities - Eager Loading

回答

1

你不是真的。 Linq在你需要的时候加载对象,但是它只是在你开始浏览对象时(无论是在代码中还是在调试器中)加载它们,所以它看起来好像你已经有了它们。

如果您执行查询并终止与数据库的连接,当您尝试浏览对象时将会收到数据库异常,因为它将无法加载它们。

编辑:对不起,我误读了这个问题。 Linq-to-entities不支持延迟加载(请参阅下面的Craig评论)。要获得完整的对象图,您应该在Linq查询中使用“Include”,或者在每个引用上调用Load()。对不起,我无法解释问题中描述的行为。你能否提供一些细节。也许发布您的查询和代码。

+0

这个答案看起来好像是LINQ to Entities做延迟加载。也许这不是我想要的,但这就是我在这里阅读文本的方式。事实上,LINQ to Entities不会执行延迟加载(除非您使用的是版本4并专门启用它)。没有看到实际的查询就很难说更多。 – 2009-09-17 14:13:39

+0

啊。好点,我刚刚看到Linq并认为Linq-to-SQL(按照我的回答描述)。是的,你是对的Craig,Linq to Entities不会做懒惰加载。您必须使用“Include”或在引用上调用Load()。在这种情况下,我无法解释问题中描述的行为。 – 2009-09-17 14:51:52

+0

公平地说,很难说为什么查询的行为方式与未查看查询的方式相同。 :) – 2009-09-17 15:53:35

0

也许你正在使用Entity Framework 4并且启用了懒惰提示。你可以在你的上下文中检查ObjectContextOptions.LazyLoadingEnabled属性。虽然该属性默认为'false',但模型生成工具通常将其设置为'true'。检查MSDN article on Loading Related Objects - 关于延迟加载的部分解释了这一点。