博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linq 延迟执行带来的困扰
阅读量:4983 次
发布时间:2019-06-12

本文共 1172 字,大约阅读时间需要 3 分钟。

有这样一个案例:

var filteredResult = from f in orgFileList select f;            for (int i = 0; i < WorkStatusFilters.ListWorkStatus.Count; i++)            {               if( !WorkStatusFilters.ListWorkStatus[i].checkStatus)                   filteredResult = filteredResult.Where(f => f.WorkStatusFlag != i.ToString());            }

这段代码的本意是筛选掉指定workstatusFlag的数据,但由于延迟执行的机制,使得该linq查询结果至少在for循环结束后才真正的执行,而这个时候i作为局部变量已经取不到值了。本应该是如下的查询:

filteredResult = filteredResult.Where(f => f.WorkStatusFlag != "0").Where(f => f.WorkStatusFlag != "2").Where(f => f.WorkStatusFlag != "5");

实际结果却是:

filteredResult = filteredResult.Where(f => f.WorkStatusFlag != null ).Where(f => f.WorkStatusFlag != null).Where(f => f.WorkStatusFlag != null);

从而导致莫名的数据异常。

此处我的修正建议是:显示调用 toList:

var filteredResult = from f in orgFileList select f;            for (int i = 0; i < WorkStatusFilters.ListWorkStatus.Count; i++)            {               if( !WorkStatusFilters.ListWorkStatus[i].checkStatus)                   filteredResult = filteredResult.Where(f => f.WorkStatusFlag != i.ToString()).ToList();            }

但这样做会牺牲一些性能,在大数据量时体现比较明显。

 

转载于:https://www.cnblogs.com/crazyghostvon/p/delayLinq.html

你可能感兴趣的文章
DuoCode测试
查看>>
关于9080端口和80端口实现真正意义的WebServer+ApplicationServer结合应用
查看>>
软件需求分析方法
查看>>
Python序列之列表 (list)
查看>>
javaScript的正则表达式
查看>>
MySQL 5.7贴心参数之binlog_row_image
查看>>
HDU 1869 六度分离【floyd】
查看>>
20150929创建数据库,表,增删改查
查看>>
angularJs 问题
查看>>
Elasticsearch学习记录(入门篇)
查看>>
matlab plot用法
查看>>
pgsql 服务遇见的问题记录
查看>>
数据库练习题
查看>>
软件工程过程 第4章 瀑布模型应用实例
查看>>
Tomcat启动Creation of SecureRandom instance卡住解决办法
查看>>
poj 2000 Gold Coins
查看>>
开通博客了
查看>>
炮兵阵地
查看>>
BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )
查看>>
try catch
查看>>