本篇讲解LINQ查询的三种形式:

  1. 查询对象
  2. 自定义查询对象某个属性
  3. 查询匿名类型结果

【1.查询结果返回集合元素】

  在LINQ查询中,select子句和from子句都是必备子句。LINQ查询表达式必须以select或group子句结束。select子句指定在执行查询时产生结果的数据集中元素的类型,它的格式如下:

 select element

  其中,select是关键字,element参数则指定查询结果中元素的类型及初始化方式。

  在进一步介绍select子句之前,首先简单介绍一下本章例子中要用到的Student类,该类表示一个学生信息。它包括一个构造函数,并重写ToString()方法产生Student的字符串形式。

  Student(学生信息)类的具体实现如下:

     /// <summary>
     /// 学生类,用来表示学生的姓名、性别、学习成绩等
     /// </summary>
     class Student
     {
         private string _Name;   // 学生姓名
         private string _Gender; // 学生性别
         private uint _Age; // 学生年龄
         private List<LessonScore> _Scores;  // 学生成绩单,一个LessonScore类列表

         /// <summary>
         /// 构造函数
         /// </summary>
         /// <param name="name">姓名</param>
         /// <param name="gender">性别</param>
         /// <param name="age">年龄</param>
         /// <param name="scores">成绩单</param>
         public Student(string name, string gender, uint age, List<LessonScore> scores)
         {
             this._Name = name;
             this._Gender = gender;
             this._Age = age;
             this._Scores = scores;
         }

         /// <summary>
         /// 构造函数
         /// </summary>
         /// <param name="name">姓名</param>
         /// <param name="gender">性别</param>
         /// <param name="age">年龄</param>
         public Student(string name, string gender, uint age)
         {
             this._Name = name;
             this._Gender = gender;
             this._Age = age;
             this._Scores = null;    // 设置默认成绩单为null
         }

         /// <summary>
         /// 学生成绩单,一个LessonScore类列表
         /// </summary>
         internal List<LessonScore> Scores
         {
             get { return _Scores; }
             set { _Scores = value; }
         }

         /// <summary>
         /// 学生年龄
         /// </summary>
         public uint Age
         {
             get { return _Age; }
             set { _Age = value; }
         }

         /// <summary>
         /// 学生性别
         /// </summary>
         public string Gender
         {
             get { return _Gender; }
             set { _Gender = value; }
         }

         /// <summary>
         /// 学生姓名
         /// </summary>
         public string Name
         {
             get { return _Name; }
             set { _Name = value; }
         }

         /// <summary>
         /// 重写ToString(),获取格式化后学生的信息
         /// </summary>
         /// <returns>生成表示学生信息的字符串</returns>
         public override string ToString()
         {
             string result;
             result = string.Format("{0}-{1}-{2}", this._Name, this._Age, this._Gender);
             return result;
         }
     }

Student(学生信息)类具体实现

  LessonScore(成绩表)类具体实现如下:

     /// <summary>
     /// 学生成绩类
     /// </summary>
     class LessonScore
     {
         private float _Score;   // 课程成绩
         private string _Lesson; // 课程名称

         /// <summary>
         /// 创建成绩表单
         /// </summary>
         /// <param name="les">课程名</param>
         /// <param name="scr">分数</param>
         public LessonScore(string les, float scr)
         {
             this._Lesson = les;
             this._Score = scr;
         }

         /// <summary>
         /// 课程成绩
         /// </summary>
         public float Score
         {
             get { return _Score; }
             set { _Score = value; }
         }

         /// <summary>
         /// 课程名称
         /// </summary>
         public string Lesson
         {
             get { return _Lesson; }
             set { _Lesson = value; }
         }

         /// <summary>
         /// 重写ToString()方法,输出指定格式的成绩信息
         /// </summary>
         /// <returns></returns>
         public override string ToString()
         {
             string result;
             result = string.Format("{0}==={1}分", this._Lesson, this._Score);
             return result;
         }
     }

LessonScore(成绩表)类具体实现

  select子句中如果不指定元素的具体类型,编译器会将查询中元素的类型自动设置为select子句中元素的具体类型。

  如果下面的示例代码,在from子句中stuItem根据students元素的类型自动判断为Student类型。select子句中指定stuItem为查询结果,并没有指定类型。

  那么自动判断为Student类型,queryResult的类型则为IEnumerable<Student>:

     static void Main(string[] args)
     {
         // 创建学生数组列表students作为数据源
         Student[] students =
         {
             ),
             ),
             ),
             ),
             )
         };
         var queryResult = (from stuItem in students select stuItem);    // 查询queryResult返回数据源students中所有元素
         // 打印查询queryResult的所有元素
         foreach (Student item in queryResult)
         {
             Console.WriteLine(item);
         }

  上面代码输出结果如下,foreach遍历queryResult中的元素,并打印元素的文本表示,调用Student类的ToString()方法来获得文本格式:

【2.查询结果返回自定义属性】

  select子句中要选择的目标数据不仅可以为数据源中的元素,还可以是该元素的不同操作结果,包括属性、方法和运算等。

  如下面的示例代码:

    queryNameResults中将学生的姓名(Name属性)作为查询结果,其是IEnumerable<string>类型;

    queryNameLengthResults则是学生的姓名(Name属性)的字符数作为查询结果,其是IEn<int>类型。

     static void Main(string[] args)
     {
         // 创建学生数组列表students作为数据源
         Student[] students =
         {
             ),
             ),
             ),
             ),
             )
         };
         // 查询queryNameResults返回数据源students中所有学生的姓名
         var queryNameResults = (from stuItem in students select stuItem.Name);
         // 打印查询queryNameResults的元素
         foreach (string item in queryNameResults)
         {
             Console.Write("{0} ", item);
         }
      Console.WriteLine();
         // 查询queryNameLengthResults返回数据源students中所有学生姓名的字符长度
         var queryNameLengthResults = (from stuItem in students select stuItem.Name.Length);
         // 打印查询queryNameLengthResults的元素
         foreach (int item in queryNameLengthResults)
         {
             Console.Write("{0},", item);
       Console.WriteLine();    
     }

  上面代码的运行结果如下,其中,第一行是queryNameResults查询结果,即学生姓名的集合中的元素。第二行是queryNameLengthResults的查询结果,即所有学生姓名字符数的集合元素:

【3.查询结果返回匿名类型】

  在某些特殊的场合下,往往查询结果只是临时使用一下,而且查询结果的数据包括很多字段,并非简单的一个属性、方法返回值等。在LINQ中可以在select子句中使用匿名类型来解决这类问题。

  如下面的示例代码,查询表达式queryResult的select子句通过匿名类型定义关键字让编译器自动判断查询中元素类型:

     static void Main(string[] args)
     {
         // 创建学生数组列表students作为数据源
         Student[] students =
         {
             ),
             ),
             ),
             ),
             )
         };

         // 查询queryResult返回数据源students中学生的姓名、年龄、姓名长度
         // 以匿名类型方式返回
         var queryResult = (from item in students select new { item.Name, item.Age, NameLength = item.Name.Length });
         // 打印查询queryResult中的元素
         foreach (var item in queryResult)
         {
             Console.WriteLine(item);
         }
     }

  运行结果如下,输出结果是匿名类的ToString()方法产生文本:

技巧:通常情况下,不需要为select子句中的元素指定具体数据类型。另外,如果查询结果中的元素只是在本函数内临时使用,尽量使用匿名类型,这样可以减少很多不必要的类定义。

内容参考:

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

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

2.3 LINQ查询表达式中 使用select子句 指定目标数据的更多相关文章

  1. LINQ查询表达式(1) - 查询表达式基础

    LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...

  2. C# LINQ查询表达式用法对应Lambda表达式

    C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...

  3. linq 在查询表达式中处理异常

    在查询表达式的上下文中可以调用任何方法. 但是,我们建议避免在查询表达式中调用任何会产生副作用(如修改数据源内容或引发异常)的方法. 此示例演示在查询表达式中调用方法时如何避免引发异常,而不违反有关异 ...

  4. LINQ查询表达式---------select子句

    LINQ查询表达式---------select子句 1.1常见的select子句查询 class Program { public class PerInfo { public int Id { g ...

  5. Linq查询表达式

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  6. LINQ 查询表达式(C# 编程指南)

    语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在 ...

  7. Linq专题之创建Linq查询表达式

    本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...

  8. LINQ之路 5:LINQ查询表达式

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...

  9. Linq学习之旅——LINQ查询表达式

    1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 ...

随机推荐

  1. 例如找出令人信服的权威C++中间malloc与new

    例如找出令人信服的权威C++中间malloc与new 问题: 非常多人都知道malloc与new都是用来申请空间用的,开辟空间来源于堆中. 可是在C++中却非常少用malloc去申请空间,为什么? 以 ...

  2. 有趣html5(两)----使用canvas结合剧本画在画布上的简单图(html5另一个强大)

    请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 于html5中能够使用canvas标签在画布上绘图,先直接上代码,这篇文章先简介一下canvas的用法.简单画几个圆,矩形,三角形,写字. 在 ...

  3. js地址下拉列表中全职工作

    /******************************************************************* *输出全国各省辖市下拉列表项writeCitys() *输出企 ...

  4. iptables的CLUSTER target以太网交换机和想法

    周末热风,这个想法从未在我的心脏像样的雨一阵悲哀. 每到周末,我会抽出一周整夜的事情的总结,无论是工作.人生,或者在上班或在锯的方式方法,并听取了抑制书评,因为无雨,周六晚上,我决定好好睡一觉,再折腾 ...

  5. zoj 3537 Cake (凸包确定+间隔dp)

    Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-sha ...

  6. Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part I

    摘要:Chromium于GPU多个流程架构的同意GPUclient这将是这次访问的同时GPU维修,和GPUclient这之间可能存在数据依赖性.因此必须提供一个同步机制,以确保GPU订购业务.本文讨论 ...

  7. jquery中DOM的操作方法

    先介绍几个比较简单的方法,不经常用到,做个记录 1. filter() 方法 顾名思义,filter是一个过滤器,如果给定表示 DOM 元素集合的 jQuery 对象,.filter() 方法会用匹配 ...

  8. Java设计模式菜鸟系列(四)工厂方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method) 工厂方法:顾名思义,就是调用工 ...

  9. .NET 对象序列化和系列化德

    DataSet ds = new DataSet(); //给ds赋值(省略) byte[] b = this.Serialize(ds); DataSet d1 = this.DeSerialize ...

  10. linux_vim_快捷键

    1.vim ~/.vimrc 进入配置文件 如果不知道vimrc文件在哪,可使用 :scriptnames 来查看 set nu #行号 set tabstop=4 #一个tab为4个空格长度 set ...