打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
什么是IQueryable?

首先,看定义:

  • public interface IQueryable : IEnumerable;

 就是说,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 并没有在内存中出现,更精确地说,没有以数据的形式在内存中出现。 

这就是奇特的IQueryable<T>.它一种半数据半方法的东西。说它是数据,因为可以像对象那样操作它;说它是方法,因为它可以实现"延迟加载(lazy loading)行为,即只有在使用时才生成对象和装载数据。

为什么要发明和使用IQueryable<T>IEnumerable<T>不行吗?

IQueryable<T>关键的,也是革命性的特性就是可以实现延迟加载。有了IQueryable<T>,就可以实现LINQ to SQL。它可以把一系列LINQ操作串联起来,在最终数据集生成之前,没有任何数据在内存中产生,这就大大降低了LINQ操作对内存的消耗,而这种消耗实际上是巨大的。否则,不得不用IEnumerable<T>,它与IQueryable<T>不同,它的所有操作都有在内存中进行,即每步操作都要把数据从数据库中加载到内存中。也许实现一个数据选择操作,它耗费了几个M的内存,最后就用一个int。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Entity Framework快速入门
C# 规范整理 集合和Linq
编写高效率的C#代码
IList,IQeurable,IEnumble和List 的区别
LINQ
Linq to “everything you want” 深入浅出(一) 实现IQueryable的基类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服