一个与Linq延迟查询有关的小例子

提出问题

下面所给代码编译时正常,但是执行时会出错,请指出程序在执行时能够执行到编号为(1)(2)(3)的代码行中的哪一行。

using System;
using System.Collections.Generic;
using System.Linq;
namespace DeferredExecutionExp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>()
            {
                new Student(){Id =1, Name="ZhangSan", Age=20},
                new Student(){Id =2, Name=null, Age=21},
                new Student(){Id =3, Name="Lisi", Age=22}
            };
            var queryedStudentList = studentList.Where(it => it.Name.Trim() != "ZhangSan");//(1)
            if (queryedStudentList.Count() > 0)//(2)
            {
                foreach (var student in queryedStudentList)//(3)
                {
                    Console.WriteLine(student.Name);
                }
            }
        }
    }
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

问题分析

其实,发现问题并不难,很显然在执行代码“it => it.Name.Trim()”时会出错,因为集合studentList中第二个学生的Name属性为null,当遍历到该学生时,对其Name属性执行Trim操作,不出错才怪呢。既然在这里会出错,那么程序肯定是执行到该行就GameOver了呀。但是实际情况又会是这样吗?

动手验证

单步调试程序,发现:执行到代码行(1)时,程序并没有出错,而是在执行代码行(2)时,程序才出现了异常,查看异常信息,却提示的是在执行代码行(1)时有问题,为什么会这样呢?为什么执行到代码行(2)时还会去执行代码行(1)呢?这全都是因为Linq的延迟查询导致的。

延迟查询

延迟查询的意思是说:在运行期间定义查询表达式时,查询不会执行,只有到迭代数据项时查询才会被执行。本例中的代码行(1)只是定义了查询,而代码行(2)中当调用Count方法时便会遍历数据项,这时便会执行查询,也就是说会去执行代码行(1)定义的查询,最终导致了本例中这种现象的出现。

所以,本例中的代码最终能够执行到的代码行是(2)。

时间: 2024-10-16 19:16:22

一个与Linq延迟查询有关的小例子的相关文章

用百度地图做了一个输入地址查询经纬度的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="jquery.js"></script> </head> <body> <input type="text"

python 查询Elasticsearch的小例子

#!/usr/bin/env python# -*- coding: utf-8 -*- from sfo_common.agent import Agentfrom sfo_common.import_common import * class ElkLog(object): """ 处理ELK数据类 """ def __init__(self): pass def get_elk_log_json(self): ""&qu

一个简单调用天气API接口的小例子

1 @{ 2 Layout = null; 3 } 4 <link href="~/Content/css/style.css" rel="stylesheet" /> 5 <script src="~/Scripts/jquery-3.3.1.js"></script> 6 <!DOCTYPE html> 7 8 <html> 9 <head> 10 <meta na

一个用Phaser控制多线程协作的小例子

package com.zl1030.Phaser; import java.util.concurrent.Phaser; public class Bot implements Runnable {     private Phaser phaser;     private int id;     public Bot(int id, Phaser phaser) {         super();         this.id = id;         this.phaser = 

mysql延迟查询, 覆盖索引使用例子

引用自 'mysql高性能' 5.3.6章节 不能使用覆盖索引的情况 :  解决办法 : 

一个用js实现拖拽的小例子

代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 7 <style> 8 9 body { 10 margin: 0; 11 } 12 13 #rect { 14 width: 100px; 15 height: 100px; 16 b

一个在页面内追加元素的小例子

如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <div id="Cnt-Main-Article-QQ" bosszone="content"> <p class=&

spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍开发使用过程.首先看图:大概的操作界面,基本使用easyui组件实现,欢迎大家吐槽: 界面包含了基本的sql查询 和 sql执行的小功能,把查询和执行分开,也是为了后台实现的需要,以及权限控制的考虑,毕竟执行的操作,会影响到系统的数据问题.查询和执行的菜单,是用easyui的手风琴式的菜单处理的.两

jetty 介绍以及小例子

Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接. 特性 编辑 易用性 易用性是 Jetty 设计的基本原则,易用性主要体现在以下几个方面: 通过 XML 或者 API 来对Jetty进行配置:默认配置可以满足大部分的需求:将 Jet