C#图解教程 第十九章 LINQ

时间:2022-03-27 07:28:12


















LINQ 什么是LINQ

在关系型数据库系统中,数据被组织放入规范化很好的表中,并且通过简单且强大的SQL语言来进行访问。因为数据在表中遵从某些严格的规则,所以SQL可以和它们很好的配合使用。
然而,在程序中却与数据库相反,保存在类对象或结构中的数据差异很大。因此,没有通用的查询语言来从数据结构中获取数据。从对象获取数据的方法一直都是作为程序的一部分而设计的。然而使用LINQ可以很轻松地查询对象集合。
如下是LINQ的重要高级特性。

LINQ(发音link)代表语言集成查询(Language Integrated Query)

LINQ是.NET框架的扩展,它允许我们以使用SQL查询数据库的方式来查询数据集合

使用LINQ,你可以从数据库、程序对象集合以及XML文档中查询数据

例:LINQ示例

class Program { static void Main() { int[] numbers={2,12,5,15}; IEnumerable<int> lowNums= from n in numbers where n<10 select n; foreach(var x in lowNums) { Console.WriteLine(x); } } }

LINQ提供程序

在之前的示例中,数据源只是int数组,它是程序在内存中的对象。然而,LINQ还可以和各种类型的数据源一起工作。然而,对于每种数据源类型,在其背后一定有根据该数据源类型实现LINQ查询的代码模块。这些代码模块叫做LINQ提供程序(provider)。
有关LINQ提供程序的要点如下

微软为一些常见的数据源类型提供了LINQ Provider

第三方在不断提供针对各种数据源类型的LINQ Provider

本章中,我们主要介绍LINQ并解释如何将其用于程序对象(LINQ to Object)和XML(LINQ to XML),其他细节和用法不做讨论。

匿名类型

在介绍LINQ查询特性的细节前,我们先学习一个允许我们创建无名类类型的特性。匿名类型(anonymous type)经常用于LINQ查询的结果中。
第6章介绍了对象初始化语句,它允许我们在使用对象创建表达式时初始化新类实例的字段和属性。提醒一下,这种形式的对象创建表达式由三部分组成:new关键字、类名或构造函数以及对象初始化语句。对象初始化语句在一组大括号内包含了以逗号分隔的成员初始化列表。
创建匿名类型的变量使用相同的形式,但是没有类名和构造函数。如下的代码行演示了匿名类型的对象创建表达式:

没有类名 ↓ new {FieldProp=InitExpr,FieldProp=InitExpr,...} ↑ 成员初始化语句

例:创建和使用匿名类型的示例。

class Program { static void Main() { 必须使用var ↓ var student=new{Name="Mary Jones",Age=19,Major="History"}; Console.WriteLine("{0},Age {1},Major: {2}",student.Name,student.Age,studeng.Major); } }

需要了解的有关匿名类型的重要事项如下。

匿名类型只能和局部变量配合使用,不能用于类成员

由于匿名类型没有名字,我们必须使用var关键字作为变量类型

不能设置匿名类型对象的属性。编译器为匿名类型创建的属性是只读的

当编译器遇到匿名类型的对象初始化语句时,它创建一个有名字的新类类型。低于每个成员初始化语句,它推断其类型并创建一个只读属性来访问它的值。属性和成员初始化语句具有相同名字。匿名类型被构造后,编译器创建了这个类型的对象。
除了对象初始化语句的赋值形式,匿名类型的对象初始化语句还有其他两种允许的形式:简单标识符和成员访问表达式。这两种形式叫做投影初始化语句(projection initializer)。下面的变量声明演示了3种形式。

var student=new{Age=19,Other.Name,Major};

例:使用3总初始化语句。注意,投影初始化语句必须定义在匿名类型声明之前。