标签:lis ref 数据库 编写高质量代码 大量 延时 hive arch each
注意:本文背景为 Linq to sql 。文中ie
指代IEnumerable
,iq
指代IQueryable
。
IQueryable
延时执行;扩展方法接受的是Expression(必须要能转成sql,否则报错)
IEnumerable
延时执行;扩展方法接受的是Func(C#语法)
ToList()
立即执行,加载数据到内存中。
AsEnumerable()
延时执行,真正使用时才加载数据。
对IQueryable对象使用AsEnumerable()后,仍然是延时执行,不过此时对象本质已经变了。
前面已经说了IEnumerable的扩展方法接受的是Func(C#语法)
,当ie对象(iq转变)真正使用时,会有2个步骤:
例如:
iq对象的Skip、Take方法,会被翻译成sql,在数据库里执行取出最终结果。
而ie对象的Skip、Take方法,则会取出全部数据到内存中,在内存中执行Skip、Take,会耗费大量资源。
误区1:对 iq对象 和 ie对象 使用foreach时,对于循环的每项都要查询数据库。
错误!
foreach针对的是数据集整体对象(枚举器?)。当使用foreach时,不管是iq对象还是ie对象,它们都是查询数据库一次,然后开始循环,直至循环结束。不过,当后续再次使用iq对象或ie对象的具体数据时,它们仍然会再次查询数据库。
假设我们把最终数据之前的数据称为中间数据,那么:
IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别
标签:lis ref 数据库 编写高质量代码 大量 延时 hive arch each
原文地址:https://www.cnblogs.com/doThing/p/9942841.html