LINQ to objects遇到的小坑
1、C#中LINQ to Objects中延迟查询的陷阱
之前在不了解LINQ延迟查询的时候,我使用下面的这种方式,将where语句的结果直接as为List<T>对象,结果得到的temp为NULL,苦思不得其解;
List<person> lst = new List<person>(){
new person(){id=,name="cyong"},
new person(){id=,name="lshan"}
};
List<person> temp = lst.Where(m => m.id > ) as List<person>;
求解思路:
一开始以为是LINQ语句的问题,但是在反复测试之后,发现 lst.Where(m => m.id > 1) 确实是语法正确的,并且能够在调用ToList()扩展方法后返回正确的结果集;
而后,考虑是as的问题,查看as的使用方式,发现as是类型安全的转换方式,当转换失败时不会报错,而是返回null;但是查看文档发现Where语句返回的是IEnumerable<TSource>,而IEnumerable<T>在一般情况下(比如我先将一个List<T>转换为IEnumerable<T>,再通过一次as转换回来)是可以正常转换为List<T>的;
求助:
然后就将这个问题抛给了群里的大神。经过一番指点,才发现这个问题的缘由是LINQ的懒加载(延迟查询)。
上文档:
文档中介绍到【查询变量本身只存储查询命令。查询的实际执行将推迟到“foreach”语句中循环访问查询变量之后进行;同时,也可以通过ToList或者ToArray方法强制立即执行,以将查询结果缓存到单个集合对象中】
Enumerable.Where<TSource>方法(IEnumerable<TSource>,Func<TSource,Int32,Boolean>)
此方法使用的是LINQ的延迟查询。
FYI:
IEnumerable对应LINQ To Object,其数据源已经存在于内存当中,所谓的延迟查询是指的从内存中进行筛选、排序等操作并取出数据。
IQueryable对应LINQ To SQL,其数据源还存在于数据库等介质当中,这里会涉及到EF的延迟加载,表示的是IQueryable只是存储并且组合中间表达式(看成是用于从数据库中进行查询的SQL语句),在遍历数据的时候,才真正到数据库中执行该SQL语句拿到经过目标数据(在SQL语句中筛选或排序)。
结论:
1、LINQ查询只是缓存查询命令,要访问查询结果,应该使用foreach去迭代或者使用ToList()或者ToArray方法强制立即执行并缓存到集合对象中。
2、MSDN文档不得不看看。
附图:
1、同行指教
LINQ to objects遇到的小坑的更多相关文章
- [C#] Linq To Objects - 如何操作字符串
Linq To Objects - 如何操作字符串 开篇语: 上次发布的 <LINQ:进阶 - LINQ 标准查询操作概述>(90+赞) 社会反响不错,但自己却始终觉得缺点什么!“纸上得来 ...
- Linq之Linq to Objects
目录 写在前面 系列文章 linq to objects 总结 写在前面 上篇文章介绍了linq的延迟加载特性的相关内容,从这篇文章开始将陆续介绍linq to Objects,linq to xml ...
- Linq To Objects
一.什么是Linq To Objects 从根本上说,Linq To Objects表示一种新的处理集合的方法.采用旧方法,必须编写指定如何从集合检索数据的复杂的foreach循环.而采用Linq方法 ...
- 查询表达式和LINQ to Objects
查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...
- LINQ之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...
- 从LINQ开始之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...
- LINQ to Objects系列(4)表达式树
为了进一步加深对Lambda表达式的理解,我们需要掌握一个新的知识,Lambda表达式树,可能听名字看起来很高深和难以理解,但实际上理解起来并没有想象中那么难,这篇文章我想分以下几点进行总结. 1,表 ...
- Linq to Objects for Java
好几年不写博客了,人也慢慢变懒了.然而想写了却不知道写点啥,正好最近手头有点小项目就分享一下经历. 现在 java 的大环境下,基本都是围着 spring 转,加上一堆其他的库.有了架子就开始搞业务了 ...
- Excel催化剂开源第13波-VSTO开发之DataGridView控件几个小坑
Excel催化剂内部大量使用了DataGridView,这其中有一些小坑,花了力气才解决的,在此给广大开发者作简单分享. 为何要使用DataGridView而不是其他控件如ListBox.ListVi ...
随机推荐
- Saving Tang Monk II(bfs+优先队列)
Saving Tang Monk II https://hihocoder.com/problemset/problem/1828 时间限制:1000ms 单点时限:1000ms 内存限制:256MB ...
- ECMAScript6新特性之Array API
一 填充数组 var arr = new Array(5); arr.fill('abc',2,4); console.log('Array.prototype.fill',arr); // [und ...
- 在c#中设置Excel格式
生成excel的时候有时候需要设置单元格的一些属性,可以参考一下: range.NumberFormatLocal = "@"; //设置单元格格式为文本 ange.get_Ran ...
- Oracle 数据库的绑定变量特性及应用
Oracle 数据库的绑定变量特性及应用[-----]转载自https://www.cnblogs.com/rootq/(原地址) 关键词: 绑定变量(binding variable),共享池(sh ...
- [leetcode]392. Is Subsequence 验证子序列
Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...
- JFinal ORM和Hibernate简要对比
1.JFinal采用ActiveRecord实现数据库操作支持,较Hibernate开发效率提升六到十倍. 2.JFinal ActiveRecord较Hibernate学习成本低,一小时内能上手开发 ...
- JAVA Get UUID
UUID是通用唯一标识码(Universally Unique Identifier),通过开源软件基金会(OSF)设立的一种算法生成.它的主要作用就是保证生成的字符串在同一时空中所有机器上都是唯一的 ...
- centos7 nginx 加入开机启动
设置nginx开机启动 vi /etc/rc.d/init.d/nginx #编辑启动文件添加下面内容 ############################################### ...
- oracle去重试验
http://blog.csdn.net/lunajiao/article/details/76014488
- window server2012服务器上如何安装nginx并启动
window环境下,Nginx安装启动的步骤如下: 把下载的window下的安装包,解压到一个不包含空格的路径下,比如:d:/Nginx 打开命令行窗口[win+R 输入cmd,然后确定]. 进入解压 ...