首先,看定义:
就是说,IQueryable继承于IEnumerable。在此之上,增加了一些属性和扩展方法。但是,关键不在这些属性和方法上,而是
IQueryable实现了革命性的新行为方式。
一般地,IQueryable用法如下:
IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>" select c;
但是,IQueryable<Customer> custs 不是一个实实在在的东西,比如,常规的可以用
foreach操作的
一组对象。
当然,有人会不同意,因为他可以的确可以使用 foreach 去操作一组对象。
这有些矛盾,这就是我为什么用“常规”这个词。事实是,当你使用foreach之前,这些对象并不存在。对于一组“常规”对象,无论你“foreach”与否,它们都已经被生产并存在了。换句话说,在 foreach 之前,IQueryable<Customer> custs 并没有在内存中出现,更精确地说,没有以数据的形式在内存中出现。
这就是奇特的
可以实现"延迟加载(lazy loading)行为,即只有在使用时才生成对象和装载数据。IQueryable<T>.它一种半数据半方法的东西。说它是数据,因为可以像对象那样操作它;说它是方法,因为它
为什么要发明和使用
IQueryable<T>?
IEnumerable<T>不行吗?
IQueryable<T>
关键的,也是革命性的特性就是可以实现延迟加载。有了
IQueryable<T>,就可以实现
LINQ to SQL。它可以把一系列LINQ操作串联起来,在最终数据集生成之前,没有任何数据在内存中产生,这就大大降低了
LINQ操作对内存的消耗,而这种消耗实际上是巨大的。否则,不得不用IEnumerable<T>,它与
IQueryable<T>不同,它的所有操作都有在内存中进行,即每步操作都要把数据从数据库中加载到内存中。也许实现一个数据选择操作,它耗费了几个M的内存,最后就用一个int。
联系客服