在实体框架中,投影是懒加载、急加载还是显式加载?

3

我了解过懒加载、使用 .include 进行急切加载和使用 .load() 进行显式加载,但是有一点让我困惑,就是当你在查询中进行投影并显式请求导航属性时:

var address = from a in context.Addresses
              select {a, Name = a.Contact.Name}

这里的Contact是一个导航属性,它连接到一个联系人实体。

我尝试了懒加载和急加载两种方式,都可以正常工作。我想知道当我像这样请求数据时,我是在进行急加载还是延迟加载?我的理解是,只会向数据库发出一次查询,这意味着它是急加载,但在这种情况下,只会加载"Name"属性,而不是如果我使用context.Addresses.include("Contact")则会加载整个Contact实体。这样的查询是否比使用.include()进行急加载更有效率?

希望能得到一些澄清。

2个回答

2

懒加载、急加载和显式加载在最常见的场景中起作用。投影是急加载的替代品,因为它可以通过单个查询加载相关实体。如果您需要使用某些复杂查询来加载实体,则使用投影是有意义的,因为急加载在这些情况下不起作用。如果您需要:

  • 在linq查询中进行任何类型的联接或聚合。据我所知,一旦开始使用手动连接,“Include”将被忽略。
  • 在导航属性中进行任何类型的过滤或排序。 “Include”只能加载导航属性中的所有相关实体,而没有任何排序。一旦您需要在相关实体上应用任何where条件或order by,就无法使用“Include”,必须使用投影。

0

这是一种惰性求值,因为它不会执行任何操作,直到有东西枚举地址。

急切加载通常用于描述实体对象的导航属性被预加载,但在这种情况下,您没有直接将任何实体对象实例化,而是投影到匿名类型上。

如果您访问 a.Contact.Name 而不是 Name,您很可能会导致另一个数据库查询,因为您没有急切地加载 Address 的 Contact 对象,而是选择并投影了 Name 属性到一个匿名对象上。


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