经典集合 与 IQueryable集合 的差别
经典集合与IQueryable 集合存在本质的区别,经典结合是在内存中开辟一片区域用来存储数据,而IQueryable集合是延迟加载的集合,只有在用到的时候才会到数据库中查询并且加载数据,下面来介绍IQueryable集合的实现机制。
IQueryable 类型的内部构造:
下面来看一条在EF中进行查询的语句:
执行这条语句的以后,IQueryable<HKSJ_USERS> 类型的集合temp并没有数据,执行这条语句实际上做的事是:
1、将linq语句解析成表达式树,保存到temp的Expression中;
2、将HKSJ_USERS类型存到temp的ElementType中去;
3、将EF的provider加载到temp的Provider中去。
在我们遍历调用temp集合的时候,temp中的Provide就会解析temp中的Expression,得到sql语句,然后到数据库中查询数据并加载,这样看起来就好像temp中存有数据一样。
有了对IQueryable集合的认识,我们学习linq的时候就会很方便了,其实linq to sql,linq to xml ,linq to object 的不同点就在于provider不同,也就是对表达式树的解析方式不同