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作用相似,都是起到范围限定 ...
随机推荐
- ubuntu-14.04 系统安装mysql-5.6.21
1.安装mysql前准备工作 (1).从官网下载mysql-5.6.21.tar.gz (2).tar -zxvf mysql-5.6.21-tar.gz 会生成mysql-5.6.21的目录 ...
- 【2014】【】辛星【php】【秋】【1】php构建开发环境
**************************什么是开发环境*********************** 1.我们学习PHP,是使用它来做web用的,通俗理解,就是做站点. 2.站点的执行须要 ...
- C++ - 派生类访问模板基类(templatized base class)命名
派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...
- jQuery、Ajax分页
1.效果预览 2.HTML代码 <div class="row"> <div class="col-lg-12 col-sm-12 col-xs-12 ...
- 据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
首先要预购和序,以恢复它: 1.首先,我们使用的是递归的方式来完成 2.递归的最小单位:一个空的树和书的前言和第一序.该序列的第一个元素是树的第一序列根,调用这种方法 3.递归的终止条件是.当这棵树的 ...
- atitit.为什么技术的选择方法java超过.net有前途
atitit.为什么技术的选择方法java超过.net有前途 #----有没有法律依据不同的铜需求... 通常有开发效率,需要在稳定性.. 笔者 老哇爪 Attilax 艾龙, EMAIL:1466 ...
- ASP.NET MVC应用程序展示RDLC报表
原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...
- [转]HttpClient使用详解
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...
- myEclipse Debug
========================================== myEclipse Debug 快捷键 ================================= ...
- oracle_连接数_查看
查看oracle数据库的连接数以及用户 .查询oracle的连接数 select count(*) from v$session; .查询oracle的并发连接数 select count(*) ...