【EF】EF映射中的延迟加载

写在前面的

   在使用Lambda或者LINQ表达式的时候经常会把返回的List<>或者一个Iquery<>对象在不恰当的时候进行内存加载,在不知道原理的情况下可能有时候我们会得到想要查询的表结构,有时候又会获取失败,那么这个到底是为什么?

   这是以为EF中存在一个延迟加载的问题,这个问题存在于List<>与Iquery<>中,有时候我们不知道应该使用哪种去实现表结构的接受,下面我们就来谈谈这两种类型的区别。

List<>

  • 在List<M>中,当我们把查询的表结构以List<>返回的时候,编译运行时就会立即在内存中创建该数据,并且如果这个被加载的表结构还有其他的关联,由于并没有对这个“关联”进行内存加载,所以代码运行时会报错。如下:

Code

/*在不知道这个原理的时候我们一般写代码会这么写*/

Ilist aaa = bbb.Where(c=>c.studentID = 1).ToList();

/*将我们的查询条件或者其他的查询结构一次性写入,然后再.ToList(),这样就可以将我们查询到的表结构作为IList返回。*/

/*但如果这么写,就会报错*/
Ilist aaa = bbb.Tolist()
var ccc = aaa.Where(d=>d.studentID = 1);

/*原因正如上文所说,因为Ilist<>在.Tolist()执行之后就已经返回了一个固定的表结构,所以与之相关联的实体是无法加载的,所以会报错*/

IQuerable

  • 与IList相反,它不会立即在内存里创建数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体(associations),此关联实体可被接下来的访问加载。

Code

IQueryable aaa = bbb.AsQueryable(); /*此时并没有加载*/

var ccc = aaa.Where(d=>d.studentID = 1);/*此时依然可以访问到指定实体属性*/

关于“延迟加载”

  • 如果在宏观上将,不对IList<>ToList()进行技巧性使用的话,那么显然IQuerable自己就实现了延迟加载

  • 但是,如果我仍然要使用IList<>来实现延迟加载呢?那么也不是没有办法,只要在写完了实体关联的条件和全部做完了查询结构之后,我们再.ToList(),也是可以实现这个延迟加载的。

总结

   其实,所谓的延迟加载,就是我们什么时候去查询数据库,从而确定表结构或者实体关系返回给程序员使用,在IList<>中,只有用到了.ToList(),才回去查询数据库。在IQuerable中只有全部遍历之后才回去查询数据库,然后返回相关实体联系。所以这两种方法都可以实现延迟加载,具体怎么使用还是看各位自己的习惯了。

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值