IQueryable VS IEnumerable

一、简介

IEnumerable和IQuerable都是.Net集合里的的接口:IEnumerable(公开枚举器),该枚举器用于迭代只读集合;IQueryable 接口则继承了IEnumerable接口。我将在下文阐述它们实质性的差异。

二、拿代码说事

//一个简单的例子-通过模糊查询获取品牌集合
public List<IGoodsBrand> SearchBrands(string key)
{
     var query = _unitOfWork.Repository<IGoodsBrand>().Table;
     var step1 = query.Where(p => p.commodityBrandName.Contains(key.Trim()));
     var step2 = step1.ToList();
     return step2;
}

此处"query"变量不必深究,我这里用的是工作单元模式。下面调用代码块中的方法,监视"step1"和"step2"的取值变化。

 PS:List<T>是实现了接口IEnumerable 的

当执行完下面代码的时候,发现并没有拿到自己想要的list,而是拿到一段sql。

var step1 = query.Table.Where(p => p.commodityBrandName.Contains(key.Trim()));

在此过程中,用扩展方法Where()中的匿名方法构建了查询表达式,用于DB Query,但此时还并没有在数据库服务器上执行。

继续跑下面的代码,调用完ToList()方法后,才得到想要的结果,如图所示:

var step2 = step1.ToList();

 

 调用ToList()的时候,实际上将之前构造好的查询表达式在数据库服务器上执行,并且将结果拉到内存中。

三、结论

上述便是EF中的延迟加载特性,其核心总结如下:

(1)所有对于IQueryable的过滤,排序等操作,只有在数据真正用到的时候才会到数据库中查询。(延迟发生)
(2)所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。(立即执行)

换而言之,用IEnumerable处理内存中的集合,但IQueryable允许使用远程数据源,如数据库或Web服务。

四、性能优化

 。。。。。。(未完待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值