IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别
nba录像回放,迪鲁卡,林乐怡
注意:本文背景为 linq to sql 。文中ie
指代ienumerable
,iq
指代iqueryable
。
iqueryable 和 ienumerable 的区别
asenumerable() 和 tolist() 的区别
误区
- 误区1:对 iq对象 和 ie对象 使用foreach时,对于循环的每项都要查询数据库。
错误!
foreach针对的是数据集整体对象(枚举器?)。当使用foreach时,不管是iq对象还是ie对象,它们都是查询数据库一次,然后开始循环,直至循环结束。不过,当后续再次使用iq对象或ie对象的具体数据时,它们仍然会再次查询数据库。
结论
假设我们把最终数据之前的数据称为中间数据,那么:
- 当中间数据只是作为条件筛选,需要的只是层层筛选之后的最终数据时,应该继续使用iqueryable,防止加载不必要的数据到内存中。
- 当存在中间数据,且中间数据被重复使用时,应该使用iqueryable.tolist()立即加载到内存里使用(都被重复使用了,应该叫做最终数据了吧..);
- 如果中间结果无用,且想对iqueryable对象使用func(c#语法)的扩展方法,应该使用iqueryable.asenumerable()转成ienumerable对象,进行后续操作。
参考
- linq查询中的ienumerable<t>和iqueryable<t>
- linq使用细节之.asenumerable()和.tolist()的区别
- 建议29:区别linq查询中的ienumerable<t>和iqueryable<t> - 陆敏技《编写高质量代码改善c#程序的157个建议》
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
网友评论