数据源是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. 使用live delegate on解决js后装html故障问题

    今天写一个前端的东西.每学到更多的知识.几下就能写几行代码.代码行数十个.代码几个文件量--这是真的.一直以来研究的前端遇到的问题仍然在实践百度谷歌问答. 我今天遇到这样的问题:已经写js代码,正确a ...

  2. Spring AOP在pointcut expression解析表达式 并匹配多个条件

    Pointcut 方法是那些需要运行"AOP",由"Pointcut Expression"为了描述叙事. Pointcut以下方法可以通过定义任&&a ...

  3. Visual Prolog 的 Web 专家系统 (6)

    保存用户响应询价.作为进一步推理的条件 或GOAL段开始.最初的一句是write_startform() write_startform():- write("<form action ...

  4. leetcode 名单 Insertion Sort List

    Insertion Sort List Total Accepted: 24444 Total Submissions: 96639My Submissions Sort a linked list ...

  5. Crazy Rows

    Problem You are given an N x N matrix with 0 and 1 values. You can swap any two adjacent rows of the ...

  6. 更新内置flash方法[转]

    原文地址:http://bbs.theworld.cn/thread-223573-1-1.html 由于目前flash插件版本较旧,而旧版flash可能会导致崩溃,其实更新方法很简单,请看如下教程. ...

  7. Node.js v0.10.31API手工-DNS

    原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...

  8. ASP.NET上传文件的几种方法

      //上传文件实例 if (fileDealer.HasFile)//判断文件是否存在        {            string filepath = "";     ...

  9. django中通过model名字获取model

    django1.6, 通过字符串和get_app.get_model获得对应的object 只需要两行代码: from django.db.models import get_model get_mo ...

  10. C#实现对mongoDB的简单增删查改

    首先添加所需要驱动包(可通过nuget获得) using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Builders; 一.设置配置 ...