有这样一个案例:

            var filteredResult = from f in orgFileList select f;
for (int i = ; 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 != "").Where(f => f.WorkStatusFlag != "").Where(f => f.WorkStatusFlag != "");

实际结果却是:

 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 = ; i < WorkStatusFilters.ListWorkStatus.Count; i++)
{
if( !WorkStatusFilters.ListWorkStatus[i].checkStatus)
filteredResult = filteredResult.Where(f => f.WorkStatusFlag != i.ToString()).ToList();
}

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

linq 延迟执行带来的困扰的更多相关文章

  1. Linq延迟执行

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  2. C#中Linq延迟执行问题

    本文来自:http://msdn.microsoft.com/zh-cn/library/bb399393(v=vs.110).aspx http://www.cnblogs.com/zhanglin ...

  3. LINQ之路 6:延迟执行(Deferred Execution)

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  4. Linq基础知识之延迟执行

    Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行,也就是在enumerator的MoveNext()方法被调用的时候执行,大说数Linq查询操作实 ...

  5. LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行

    延迟执行是指一个表达式的值延迟获取,知道它的值真正用到. 当你用foreach循环时,表达式才真正的执行. 延迟执行有个最重要的好处:它总是给你最新的数据 实现延迟运行 你可以使用yield关键字实现 ...

  6. LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用

    延迟执行的经典例子: 我们用 select ++i 就可以看到在foreach 时候,查询才被执行. public static void Linq99(){    int[] numbers = n ...

  7. PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰

    有朋友下载了PHP5.3,PHP5.4版本想加载mysql支持的时候发现没有libmysql.dll文件,无法完成mysql配置,其实PHP5.3版本开始,使用mysqlnd库,不再使用libmysq ...

  8. C#延迟执行

    借鉴于该篇博客:http://kb.cnblogs.com/page/42581/ 先看两个方法 public class YieldClasses { public static IEnumerab ...

  9. ThreadPoolTimer -延迟执行, 周期执行

    介绍重新想象 Windows 8 Store Apps 之 线程池 通过 ThreadPoolTimer 实现延迟执行 通过 ThreadPoolTimer 实现周期执行 通过 ThreadPool ...

随机推荐

  1. caffe的python接口

    http://blog.csdn.net/lu597203933/article/details/46742199 hadoop改成自己名字

  2. Servlet配置信息

    @WebServlet("/HelloServlet") @WebServlet(     Name=”Hello”,     urlPatterns=(“/hello.view” ...

  3. ecshop中user.php中的$user说明---user表加字段

    今天想对user表加个字段,打开user.php发现有个$user,其中它有很多方法,像登陆,注册,退出.都要用到它.可找了大半天也找不到这个函数调用的是哪个类.又坚持找了半天,发现$user在ini ...

  4. unity, 播放循环背景音乐注意事项

    循环背景音乐用wav格式,不要用mp3. 参考:http://answers.unity3d.com/questions/343057/how-do-i-make-unity-seamlessly-l ...

  5. Maven学习 (一) 搭建Maven环境

      有两种方式可以配置maven的环境配置,本人推荐使用第二种,即使用本地的maven安装文件,个人感觉这样可以方便管理下载jar包的存放位置,错误信息的输出等,可以在dos窗口中可以清晰看到,虽然比 ...

  6. SQL 表 和字符串 互转 (行列互转)

    -- 表转字符串 )) ,,'') --字符串转表 ),)) ,) )) AS BEGIN DECLARE @StartIndex INT --开始查找的位置 DECLARE @FindIndex I ...

  7. SQL2005 遍历表插入

    /* sql2005遍历表(方法1) insert into 数据表(userid,adddate) values((select userid from 用户表),date); */ /*sql20 ...

  8. SQL Server2005作业执行失败的解决办法

    数据库:SQL Server 2005,运行环境:Windows Server 2008  在数据库里的所有作业都执行失败,包括自动执行和手动执行.在事件查看器里看到的错误报告如下: 该作业失败.  ...

  9. 3D数学 ---- 矩阵和线性变换[转载]

    http://blog.sina.com.cn/s/blog_536e0eaa0100jn7c.html 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线 ...

  10. Python 列表

    python 列表 列表的特点 1.列表是一种可变的数据类型,这点是跟元组有区别的 2.列表中的值是有序的,并且可存放重复的值,这点跟set有区别的 3.python中的列表类似于其它语言中的数组 4 ...