8.3.1  LINQ基础

8.3.1 LINQ基础

(1)LINQ概念

LINQ(Language Integrated Query),语言集成查询,是一组用于C#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

查询是一种从数据源检索数据的表达式。查询通常用专门的查询语言来表示。随着时间的推移,人们已经为各种数据源开发了不同的语言,例如,用于关系数据库的SQL和用于XML的XQuery。因此,开发人员不得不针对它们必须支持的每种数据源或数据格式而学习新的查询语言。LINQ通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。

(2)LINQ优点

1)无需复杂学习过程即可上手。

2)编写更少代码即可创建完整应用。

3)更快开发错误更少的应用程序。

4)无需求助奇怪的编程技巧就可合并数据源。

5)让新开发者开发效率更高。

6)任何对象或数据源都可以定制实现LINQ适配器,为数据交互带来真正方便。

(3)LINQ查询实例

所有LINQ查询操作都由3个不同的操作组成:获取数据源、创建查询、执行查询。

下面先介绍一个示例。在这个示例中,创建了一个查询,使用LINQ在一个简单的内存对象数组中查找一些数据,并输出到控制台上。代码如下:

978-7-111-46863-9-Chapter08-12.jpg

在上面的示例中,第一步是创建一些数据,就是声明并初始化names数组:

978-7-111-46863-9-Chapter08-13.jpg

程序的下一部分是创建LINQ查询语句:

978-7-111-46863-9-Chapter08-14.jpg

这是一个看起来比较古怪的语句。它不像是C#语言,实际上from...where...select类似于SQL数据库查询语言。

但是,这个语句不是SQL,而是在编译器中输入这些C#代码时,from、where和select会突出显示为关键字,这个古怪的语法对编译器而言是完全正确的。

这个程序中的LINQ查询语句使用了LINQ声明性查询语法。该语句包括4个部分:以var开头的结果变量声明,使用查询表达式给该结果变量赋值,查询表达式包含from子句、where子句和select子句。下面逐一介绍它们。

1.用var关键字声明结果变量

978-7-111-46863-9-Chapter08-15.jpg

var在前面已经介绍过,用于声明一般的变量类型,特别适合于包含LINQ查询的结果。var关键字告诉C#编译器,根据查询推断结果的类型。这样,就不必提前声明从LINQ查询返回的对象类型了——编译器会推断出该类型。如果查询返回多个结果,该变量就是查询数据源中的一个对象集合(在技术上它并不是一个集合,只是看起来像是集合而已)。

2.指定数据源(from子句):

978-7-111-46863-9-Chapter08-16.jpg

本例中的数据源是前面声明的字符串数组names。变量n只是数据源中某一元素的代表,类似于foreach语句后面的变量名。指定from子句,就可以只查找集合的一个子集,而不用迭代所有的元素。说到迭代,LINQ数据源必须是可枚举的——必须是数组或集合,可以从中选择出一个或多个元素。

注意:数据源不能是单个值或对象,例如单个int变量。

3.指定条件(where子句):

978-7-111-46863-9-Chapter08-17.jpg

可以在where子句中指定能应用于数据源中各元素的任意布尔(true或false)表达式。实际上,where子句是可选的,甚至可以忽略,但在大多数情况下,都要指定where条件,把结果限制为需要的数据。where子句称为LINQ中的限制运算符,因为它限制了查询的结果。

4.指定元素(select子句)。

最后,select子句指定结果集中包含哪些元素。select子句如下:

978-7-111-46863-9-Chapter08-18.jpg

select子句是必需的,因为必须指定结果集中有哪些元素。因为在结果集的每个元素中都只有一项name。如果结果集中有比较复杂的对象,使用select子句的有效性就比较明显。

5.完成(使用foreach循环)。

现在输出查询的结果。与把数组用作数据源一样,像这样的LINQ查询结果是可以枚举的,即可以用foreach语句迭代结果:

978-7-111-46863-9-Chapter08-19.jpg