[C#] IEnumerable vs IQueryable
这篇博客将介绍IEnumerable和IQueryable之间的区别。
1. IQueryable是继承自IEnumerable接口的。所以IEnumerable能做的,IQueryable都能做。
2. 先看代码,然后再讲两者之间的区别。
using (NerdDinnerDataContext context = new NerdDinnerDataContext()) { IEnumerable<Dinner> dinners = context.Dinners; IEnumerable<Dinner> filters = dinners.Where(d => d.DinnerID > 0).ToList(); }
这段代码是去查询并找出DinnerID>0的所有Dinner。通过SQL Server Profiler可以看出,Where后面的过滤并没有在SQL中执行,而是将所有的Dinner集合返回到Client端,然后再进行Filter操作的。
下面将IEnumerable替换成IQueryable
using (NerdDinnerDataContext context = new NerdDinnerDataContext()) { IQueryable<Dinner> dinners = context.Dinners; IEnumerable<Dinner> filters = dinners.Where(d => d.DinnerID > 0).ToList(); }
通过SQL Server Profiler可以看到,数据集的过滤是在DB一层执行的。
IQueryable与IEnumerable的区别在于前者的filter逻辑在DB端执行,后者的filter逻辑在Client端执行。
结论:
如果数据集合均为内存数据,建议使用IEnumerable。
如果数据是从数据库中获取,建议使用IQueryable,这样可以降低网络流量和充分利用SQL Server的处理能力。
感谢您的阅读~
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。