2.2 LINQ中使用from子句指定数据源
数据源是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子句指定数据源的更多相关文章
- 2.4 LINQ中使用where子句指定筛选条件
本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...
- 2.3 LINQ查询表达式中 使用select子句 指定目标数据
本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...
- Linq 中查询一个表中指定的字段
//Linq中查询一个表中指定的几个字段: ); // FindAllItems()为查询对应表的所有数据的方法: // Where 里面为查询条件 // Select 为查询的筛选条件 new{} ...
- Linq中关键字的作用及用法
Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...
- LINQ中的一些查询语句格式
LINQ的基本格式如下所示:var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式> ...
- C#编程(六十一)------------LINQ中的扩展方法
原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...
- LINQ查询表达式---------join子句
LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...
- LINQ查询表达式---------where子句
LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...
- Linq中demo,用力看看吧
本文导读:LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能.Linq中where查询与SQL命令中的Where作用相似,都是起到范围限定 ...
随机推荐
- Windows Phone 8 应用内截图
WriteableBitmap wb = new WriteableBitmap(this.LayoutRoot, new MatrixTransform()); //wb.Render(this.L ...
- Mapxtreme C#鹰眼地图
Demo演示程序下载地址: http://pan.baidu.com/s/1jG9gKMM#dir/path=%2F%E4%BA%A7%E5%93%81%2FDemos 找:EagelEyeMap.r ...
- 金蝶K3管理软件PDA条码解决方式,盘点机与金蝶K3无缝对接
申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.com 原帖:http://www.hanma-sc ...
- ES6 扫盲
原文地址:ECMAScript 6 扫盲--小胡子 1. let.const 和 block 作用域 let 允许创建块级作用域,ES6 推荐在函数中使用 let 定义变量,而非 var: var a ...
- MySQL进口.sql文件和常用命令
MySQL进口.sql文件和常用命令 在MySQL Qurey Brower中直接导入*.sql脚本,是不能一次运行多条sql命令的.在mysql中运行sql文件的命令: mysql> so ...
- android_Activity生命周期功能
说明:初步activity 生命周期7功能. 样本:于MainActivity我加了button,搬家button.跳到OtherActivity.控制台输出的观察. 让我们来看看这些功能: 他们的流 ...
- JAVA转让JS功能
今天,在发展中使用js和Java互动.通常我们使用更多的是js转让Java方法.可以使用dwr.Ajax.jquery.突然发现Java转让js然后,我真的没见过,今天,互联网提供以下信息,顺便总结: ...
- hdu 4972 A simple dynamic programming problem(高效)
pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...
- NYOJ 330 一个简单的数学
一个简单的数学题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 zyc近期迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能 ...
- mysql_【MySQL】常见的mysql 进程state
Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ). checking permissions 线程是检查服务器是否具有所需的权限来执行该语句. Ch ...