2.3 LINQ查询表达式中 使用select子句 指定目标数据
本篇讲解LINQ查询的三种形式:
【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子句 指定目标数据的更多相关文章
- LINQ查询表达式(1) - 查询表达式基础
LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...
- C# LINQ查询表达式用法对应Lambda表达式
C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...
- linq 在查询表达式中处理异常
在查询表达式的上下文中可以调用任何方法. 但是,我们建议避免在查询表达式中调用任何会产生副作用(如修改数据源内容或引发异常)的方法. 此示例演示在查询表达式中调用方法时如何避免引发异常,而不违反有关异 ...
- LINQ查询表达式---------select子句
LINQ查询表达式---------select子句 1.1常见的select子句查询 class Program { public class PerInfo { public int Id { g ...
- Linq查询表达式
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- LINQ 查询表达式(C# 编程指南)
语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上. 借助于 LINQ,查询现在 ...
- Linq专题之创建Linq查询表达式
本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...
- LINQ之路 5:LINQ查询表达式
书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...
- Linq学习之旅——LINQ查询表达式
1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 ...
随机推荐
- BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长
标题效果:给定一个序列,单点变化,询价区间k大. 思维:假设没有变化.然后划分树就可以解决,但树的分工仍然是一棵树,它不支持的变化. 主席舒变化实际上是在外带fenwick右护套层值段树,但正确的值线 ...
- PC远程调试设备(转)
我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题——调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...
- Android:抄QQ照片选择器(按相册类别显示,加入选择题)
这个例子的目的是为了实现类似至QQ照片选择功能.选择照片后,,使用类似新浪微博 微博 页面上显示. 先上效果图: 本例中使用的主要技术: 1.使用ContentProvider读取SD卡全部图 ...
- Linux 常用命令汇总
1.shutdown -s 时间 如果是想马上关机就直接输入0或者now: 2.init 0 这个是运行级别关机: 3.halt 这个命令不是很好用: 4.power off 这个命令也是很好用的. ...
- Oracle存储过程详解(引用)+补充(转) dbms_output包 good
执行存储过程时,execute和call的区别 EXEC is a sqlplus command that put its argument as an anonymous pl/sql block ...
- 【 Android官方文件读书笔记】连接网络
一间连接应用网络的主要功能.Android系统对网络连接进行了封装,使得开发人员可以更快的给应用添加网络功能.大多数网络连接的Android应用使用HTTP发送和接受数据.Android包含两个HTT ...
- Javascript设计模式与开发实践读书笔记(1-3章)
第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用 多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...
- 在ASP.NET 5应用程序中的跨域请求功能详解
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
- tomcat-jQ-springMVC-bootstrap
基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...
- SQL Server的备份
原文:SQL Server的备份 0.参考文献 1.恢复模式 SQL Server 备份和还原操作发生在数据库的恢复模式的上下文中. 恢复模式旨在控制事务日志维护. “恢复模式”是一种数据库属性,它控 ...