数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象。

  可以将IEnumerable<T>简单理解成一个包含多个元素的列表(或数据库中的表),可以用foreach遍历它所有的元素,从而轻松地完成查询操作。

  由于是泛型接口,所以通过为数据源指定不同的元素类型,可以表示任何数据集合。

  在.NET类库中,列表类、集合类、数组等都实现了接口IEnumerable<T>,所以可以直接将这些数据对象作为数据源在LINQ查询中使用。

  每个LINQ查询都以from子句开始,from子句包括以下两个功能:

  • 指定查询将采用的数据源
  • 定义一个本地变量,表示数据源中的单个元素

  单个from子句的编写格式如下,其中,dataSource表示数据源,localVal表示单个元素:

 from localVal
 select dataSource

  一般情况下,不用为from子句的localVal元素指定数据类型,编译器会根据数据源的类型为它分配合适的类型,通常元素类型为IEnumerable<T>中的类型T。

  例如,当数据源为IEnumerable<int>时,编译器为localVal指定类型为int。当数据远为IEnumerable<string>时,编译器为localVal指定类型为string。

  如下列代码所示,由于nums是int[]类型,默认实现了接口IEnumerable<int>,所以numItem的类型为int:

 ,,,,,,,}; // 定义int数组nums为数据源
 var queryResult = (from numItem in nums select numItem); // LINQ查询数据源nums中所有元素

  一些特殊情况下,开发人员还需要为本地变量指定数据类型,比如上面的代码,希望将nums中的元素作为object类型进行处理,而不是作为int。这就需要在form子句中为numItem指定目标类型。

  如下列代码所示,指定numItem为object类型,由于nums中的元素为int类型,属于object类型的子类型,所以可以直接转换为object类型:

 ,,,,,,,}; // 定义int数组nums为数据源
 var queryResult = (from object numItem in nums select numItem); // LINQ查询数据源nums中所有元素,指定元素类型为object

  值得一提的是,编译器并不会检查本地变量(numItem元素)的具体类型,所以当指定类型不正确时,编译时并不会报错。

  如下面的代码,本地参数numItem指定为Student类型,但是numItem实际是int类型,所以将numItem指定为Student类型是错误的,编译器并不会报错。

  但是当下面的foreach语句使用该查询时,会在运行时进行类型检查,从而产生异常。

     class Program
     {
         static void Main(string[] args)
         {
             , , , , , , ,  };    // 定义int数组nums为数据源
             var queryResult = (from Student numItem in nums select numItem);    // LINQ查询数据源nums中所有元素,元素类型指定为Student
             // 遍历并打印查询结果
             foreach (var item in queryResult)
             {
                 Console.Write(item.ToString());
             }
         }
     }

     class Student { }

  当Debug上面代码的时候,产生的异常提示如下图,即不能将一个int类型的变量强制转换成Student类型:

建议:如果没有特别需要,笔者建议使用不指定类型的本地变量,让编译器自动根据数据源判断具体的元素类型。

内容参考:

《精通C#5.0与.NET 4.5高级编程——LINQ、WCF、WPF和WF》

【来自 孤影'Blog:http://www.cnblogs.com/LonelyShadow,码字不容易,转载请注明出处。】

2.2 LINQ中使用from子句指定数据源的更多相关文章

  1. 2.4 LINQ中使用where子句指定筛选条件

    本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...

  2. 2.3 LINQ查询表达式中 使用select子句 指定目标数据

    本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...

  3. Linq 中查询一个表中指定的字段

    //Linq中查询一个表中指定的几个字段: ); // FindAllItems()为查询对应表的所有数据的方法: // Where 里面为查询条件 // Select 为查询的筛选条件 new{} ...

  4. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  5. LINQ中的一些查询语句格式

    LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...

  6. C#编程(六十一)------------LINQ中的扩展方法

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...

  7. LINQ查询表达式---------join子句

    LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...

  8. LINQ查询表达式---------where子句

    LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...

  9. Linq中demo,用力看看吧

    本文导读:LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能.Linq中where查询与SQL命令中的Where作用相似,都是起到范围限定 ...

随机推荐

  1. minigui编译

    1, libminigui修改单 file: src/kernel/desktop.c func: def_mouse_handler keywords: MSG_DT_RBUTTONUP break ...

  2. (Protype Pattern)原型模式

    定义: 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象 适用性: 当我们系统中有一些类,在使用的时候都有同样需要大量的创建,而这样的创建是复杂的而且是浪费CPU,内存资源的 ...

  3. Integer对象

    数字格式的字符串转成基本数据类型的方法: 1:将该字符串封装成了Integer对象,并调用对象的方法intValue(); 2:使用Integer.parseInt(numstring):不用建立对象 ...

  4. Unity Layout碰撞检测

    第一次看到LayerMask根本不知道是什么东东,后来问问度娘,看了几篇文章,终于看明白一点点,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Laye ...

  5. 在PHP中处理表单之—Checkbox

    原文翻译自:http://www.html-form-guide.com/php-form/php-form-checkbox.html 单个checkbox  形如: <form action ...

  6. 【stanford C++】字符串(String)与流(Stream)

    字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...

  7. 手机自动化测试:appium源码分析之bootstrap八

    手机自动化测试:appium源码分析之bootstrap八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣, ...

  8. Nginx-OpenResty安装配置

    上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...

  9. PHP如何动态传入参数

    首先需要说明的是,URL写作/index.php/xx/b/c可以直接被index.php文件接受,而不用做任何额外的操作 但是如果需要在URL中隐藏index.php的话,才需要伪静态重写规则,将^ ...

  10. git stash命令

    命令:git stash 1.使用git stash 保存当前的工作现场, 那么就可以切换到其他分支进行工作,或者在当前分支上完成其他紧急的工作,比如修订一个bug测试提交. 2.如果一个使用了一个g ...