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的懒加载(延迟查询)。

  上文档:

  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、同行指教

最新文章

  1. go语言环境搭建
  2. 表格CSS样式美化
  3. There has been an error processing your request magento
  4. UVA 11133 - Eigensequence DP
  5. js学习笔记一类型、值和变量
  6. Android Service 服务(一)—— Service .
  7. BZOJ 1507 Editor
  8. ural 1837 Isenbaev&#39;s Number
  9. Photoshop CS6 基础知识
  10. jquery倒计时自动跳转
  11. Qt4----子例化QDialog(可扩展对话框的使用)
  12. 无线连接手机进行Android测试
  13. linux下修改MAC地址方法
  14. ACID 数据库正确执行四要素
  15. SpringBoot应用的启动方式
  16. 开源框架Volley的使用《一》
  17. ASP.NET Core的JWT的实现(自定义策略形式验证).md
  18. Shiro与CAS整合实现单点登录
  19. datatables 添加excel下载
  20. SpringBoot的Controller使用

热门文章

  1. [poj1269]Intersecting Lines
  2. Hamburgers
  3. 测试SQL
  4. IIS支持IPA、APK文件的下载
  5. HttpApplicationState与HttpApplication
  6. [SoapUI] 通过context获取response并解析里面的某个字段的值
  7. springmvc 返回汉字乱码
  8. android 网站上下的 adt 不能显示没有安装的
  9. 2018.08.10 atcoder Median Sum(01背包)
  10. Linux服务器部署系列之六—远程管理篇