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服务。

四、性能优化

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

猜你喜欢

转载自blog.csdn.net/Stefan_J/article/details/82900750