Linq之IQueryable接口与IEnumberable区别
IEnumerable接口
公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。也就是说:实现了此接口的object,就可以直接使用foreach遍历此object;
IEnumerable 包含一个方法,GetEnumerator,返回 IEnumerator。 IEnumerator 可以通过集合循环显示 Current 属性和 MoveNext 和 Reset 方法。
它是一个最优方法实现 IEnumerable 和 IEnumerator 在集合选件类启用 foreach (For Each 在 Visual Basic 中为) 语法,但是,IEnumerable 不需要实现。 如果集合中不实现 IEnumerable,您还必须遵循迭代器窗体通过提供返回接口、选件类或结构的 GetEnumerator 方法支持此语法。
IQueryable 接口
IQueryable 接口继承 IEnumerable 接口,以便在前者表示一个查询时可以枚举该查询的结果。 枚举强制执行与 IQueryable 对象关联的表达式目录树。 “执行表达式目录树”的定义是查询提供程序所特有的。实现IQueryable接口可以实现自己的查询提供程序。
那么他们的区别到底在哪儿呢?下面看一个例子:
1 namespace Wolfy.LinqDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 using (UserInfoDataContext context = new UserInfoDataContext()) 8 { 9 10 //查询的结果放入IQueryable接口的集合中 11 IQueryable<TB_UserInfo> userInfoQuery= (from u in context.TB_UserInfos 12 orderby u.ID 13 select u).Skip<TB_UserInfo>(3).Take<TB_UserInfo>(3); 14 //注意这个AsEnumerable<T_Class>()在分页查询之前,先将其转换成IEnumerable类型 15 IEnumerable<TB_UserInfo> userInfoEnum = (from u in context.TB_UserInfos 16 orderby u.ID 17 select u).AsEnumerable<TB_UserInfo>().Skip<TB_UserInfo>(3).Take<TB_UserInfo>(3); 18 //执行查询 19 int i = 0; 20 foreach (var item in userInfoQuery) 21 { 22 i++; 23 } 24 foreach (var item in userInfoEnum) 25 { 26 i++; 27 } 28 Console.WriteLine("OK"); 29 Console.Read(); 30 } 31 } 32 } 33 }
直接返回IQueryable接口生成的sql语句
第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示
总结
-
博客地址:http://www.cnblogs.com/wolf-sun/
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义