接下来一段时间我将投入一部分精力在维护公众号上面,介绍的技术将主要在EF Core、ASP.NET Core上,不出意外的话基本会保证2-3天更新一篇文章,同时会保证一篇文章讲解的内容很少,公众号对于放置代码不太方便,所以我尽量少放代码,直接叙述,若有疑问可留下您的评论告知于我。


到目前为止EF Core仅仅只支持显式加载和饥饿加载,对于延迟加载我们也可在EF Core 2.1预览版本上看到已经支持,待发布稳定时我们就可以用了,在EF Core 2.1中延迟加载作为单独引入包来使用,届时大家可以尝试,今天我们来讲讲饥饿加载。


在EF Core中饥饿加载通过Include来实现,打个比方如下:

谈谈EntityFramework Core饥饿加载_java


这种方式和EF 6.x中使用方式一样,没有什么可讲的。我们思考一下,上述查询是将Blogs表中所有列返回,很多情况下我们只是返回少数列,此时将演变成如下情况:

谈谈EntityFramework Core饥饿加载_java_02

谈谈EntityFramework Core饥饿加载_java_03


上述我们在饥饿加载Posts后接着进行投影但是未查询Posts,此时打印出SQL忽略了Posts的查询,这是EF Core默认的行为,当然一般情况都不会这么做,既然我们用不到那么也就不需要进行饥饿加载了不是。


在实际查询中我们可能遇到通过导航属性进行数据过滤的情况,比如如下表:

谈谈EntityFramework Core饥饿加载_java_04


当我们查询BlogId等于1的数据同时饥饿加载Posts,但是此时我们仅仅只是想返回Name等于Jeffcky2的Posts,正常情况下此时我们是不是应该会进行如下查询呢?

谈谈EntityFramework Core饥饿加载_java_05

谈谈EntityFramework Core饥饿加载_java_06


此时将抛出如上不支持异常,当前在EF Core中还不支持通过导航属性筛选数据,其实这算是优先级比较高的特性了,大多时候我们需要通过导航属性继续筛选数据,不知道什么时候EF Core能够实现,针对这种情况我们可利用投影的方式来筛选数据。

谈谈EntityFramework Core饥饿加载_java_07

谈谈EntityFramework Core饥饿加载_java_08


如上能够正常查询返回我们所需要的结果,但是我们看看查询日志会发现如下提醒语句:

谈谈EntityFramework Core饥饿加载_java_09


此时我们直接去掉饥饿加载Posts,变成如下语句:

谈谈EntityFramework Core饥饿加载_java_10



本文只要讲述饥饿加载的问题,默认情况下当查询对象并通过饥饿加载导航属性,若返回的对象为匿名对象或者重新实例化的对象,此时导航属性将会被忽略,若需要通过导航属性筛选数据,那我们可通过投影来加载导航属性,换言之,通过投影也可加载导航属性而并不是只有通过饥饿加载来加载导航属性。