代码改变世界

通过F11清晰查看Linq的延迟查询

2011-11-24 14:53  Ref Tian  阅读(184)  评论(0编辑  收藏  举报

Linq的延迟查询实质是在需要的时候才会取出需要的数据,下面通过一个简单的例子+F11的逐语句调试清晰的展现:

            int[] number = {1,5,6,8,9};
            IEnumerable<int> getnumber = number.Where(i => i >= 6);//1.处通过F11执行时此处只执行一次。
            foreach (int i in getnumber)//2.当进行循环显示时此处会返回到1处继续执行,然后依次取出i
            {
                MessageBox.Show(i.ToString());
            }

            number[0] = 15;

            foreach (int i in getnumber)
            {
                MessageBox.Show(i.ToString());
            }

 这如语句中的注释,通过调试可以清楚的看到语句的执行顺序,在number【0】=15;改变源数据后结果同样会被改变。这样的执行方式如果查询语句中有异常编译的时候是没有问题的,除非你运行了这段代码否则你不会发现任何异常,如果你不想执行这样的延迟查询,你可以通过ToArray.ToList等操作将数据直接抓出,看下面的代码:

            int[] number = {1,5,6,8,9};
            List<int> numberlist = number.Where(i => i >= 6).ToList();//1.此時程式則會直接查詢出相應的結果而不會再進行緩存動作,在i >= 6处会执行多次,以便直接取出相应的信息
            foreach (int i in numberlist)//2.此处代码没有重新返回到1处执行
            {
                MessageBox.Show(i.ToString());
            }

            //此時改變他的數值看其中的結果會怎樣
            number[0] = 55;
            foreach (int i in numberlist)
            {
                MessageBox.Show(i
                                    .ToString());
            }

 此段代码的执行解释如注释,而改变数据源之后再次输出结果,你会发现其结果没有发生变化,通过以上代码+F11你可以清晰的看到Linq的延迟执行。