建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
来源:互联网 发布:触摸屏餐饮软件源码 编辑:程序博客网 时间:2024/05/20 16:11
建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展;Queryable类,它针对继承了IQueryable<T>接口的集合类进行扩扎。接口IQueryable<T>也是继承了IEnumerable<T>接口的,所以,致使两个接口的方法在很大程度上时一致的。
LINQ查询从功能上来讲实际上可分为3类:LINQ to OBJECTS、LINQ to SQL、LINQ to XML。设计两套接口的目的在于区分对待LINQ to OBJECTS、LINQ to SQL,两者对于查询的处理在内部使用的是完全不同的机制。针对LINQ to OBJECTS时,使用Enumerable中的扩展方法对本地集合进行排序和查询等操作,查询参数接受的是Func<>。Func<>叫做谓语表达式,相当于一个委托。针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression<>。Expression<>用于包装Func<>。LINQ to SQL最终会将表达式树转换成相应的SQL语句,然后在数据库中执行。
简单的说:本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>。
在使用IEnumerable<T>和IQueryable<T>的时候还需要注意,IEnumerable<T>查询的逻辑可言直接用我们自定义的方法,而IQueryable<T>则不能使用自定义的方法,它必须先生成表达式树,查询由LINQ to SQL引擎处理。在使用IQueryable<T>查询的时候,若果使用自定义方法,则会抛出异常。
DataContext ctx = new DataContext("server=192.168.0.102;database=Temp;uid=sa;pwd=sa123"); Table<Person> persons = ctx.GetTable<Person>(); var temp1 = from p in persons where OlderThan20(p.Age) select p; foreach (var item in temp1) { Console.WriteLine(string.Format("Name:{0}\tAge:{1}", item.Name, item.Age)); }
抛出异常NotSupportedException:方法“Boolean OlderThan20(Int32)”不支持转换为SQL。
但是,如果我们将查询转换成一个IEnumerable<T>查询,这种模式是支持的:
List<int> list = new List<int>() { 17, 18, 19, 20, 21, 22, }; var temp2 = from c in list where OlderTan20(c) select c;
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
- 建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
- IQueryable<T>和IEnumerable<T>的区别
- IEnumerable<T>和IQueryable<T>区分
- linq里的IEnumerable和IQueryable区别
- Entity Framework中使用IEnumerable<T>、IQueryable<T>及IList<T>的区别
- IEnumerable和IQueryable的区别
- IQueryable和IEnumerable的区别
- IQueryable和IEnumerable的区别
- IEnumerable和IEnumerable<T>接口
- IEnumerable和IEnumerable<T>接口
- IEnumerable和IEnumerable<T>接口
- IEnumerable和IEnumerable T接口
- IEnumerable和IEnumerable<T>接口
- C# IQueryable和IEnumerable的区别
- 大话 IQueryable和IEnumberable and IList与Lis t区别
- IEnumerable, IQueryable的区别
- "IQueryable and IEnumerable"区别
- IEnumerable 和IQueryable
- hibernate中使用sql
- Android 解决滑动冲突 疑问和解答
- javascript 预处理
- strtok、strtok_s、strtok_r 字符串分割函数
- ffmpeg学习---4.Playing Sound
- 建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
- 对于grub2引导的非debian系linux更新系统内核的脚本
- 简单的委托使用
- 推荐的自动标注工具
- UVA 1386 cellular automaton [循环矩阵+矩阵快速幂]【数学】
- ffmpeg学习---5.Spawning Threads
- Spark笔记
- Linux命令---文件链接
- 戴尔PowerEdge服务器通过SAP HANA认证