本篇讲解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. BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

    标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...

  2. js之第三方工具解析JSON

    1.JSON 仅仅是一种文本字符串.它被存储在 responseText 属性中 为了读取存储在 responseText 属性中的 JSON 数据,须要依据 JavaScript 的 eval 函数 ...

  3. Docker container communication with ovs

    2台宿主机,192.168.11153,192.168.1.154 安装OVS rpm -ivh openvswitch-2.4.0-1.x86_64.rpm #预先下载的 配置OVS 1. 按照上一 ...

  4. POJ 2996 &amp; 2993 国际象棋布局 模拟

    Description Your task is to read a picture of a chessboard position and print it in the chess notati ...

  5. Android开发之异步具体解释(二)之AsyncTask

    请尊重他人的劳动成果,转载请注明出处:Android开发之异步具体解释(二)之AsyncTask http://blog.csdn.net/fengyuzhengfan/article/details ...

  6. Hadoop Streaming 得到mapreduce_map_input_file中遇到的问题的版本号

    1.Hadoop Streaming,您可以在任务获得hadoop设置环境变量, 例如,使用awk书面map从而能获得:filename = ENVIRON["mapreduce_map_i ...

  7. CSDN博文“待定”如何避免检测规则分析“待定”

    这些天一直很郁闷.鲍文本人一直"待定", 当然,这是非常不舒服的自己.那么今晚最终成为一个非成功出版"待定"文章,这CSDN于大家的反映而放弃了.没想到我后面又 ...

  8. Open the Lock

    Problem Description Now an emergent task for you is to open a password lock. The password is consist ...

  9. nginx.conf 完整的集群配置

    ###############################nginx.conf 整配置############################### #user nobody; # user 主模 ...

  10. unix cd使用命令

    [语法]:     cd   [夹] [说明]:此命令用于工作文件以改变当前的文件夹,使用环境变量没有参数$HOME 作为它的参数,$HOME 路径通常在注册时输入. [抽样]: cd   文件夹 c ...