文章教程

11.1LINQ概述

8/31/2020 9:19:23 PM 人评论 次浏览

11.1 LINQ概述

查询通常用专门的查询语言来表示,例如关系数据库中的SQL和XML中的XQuery。LINQ将查询作为C#语言的一种内置特性,提供一种跨各种数据源和数据格式使用数据的一致模型,使开发人员可以使用相同的编码模式来查询和转换XML文档、SQL数据库、ADO.NET数据集、.NET集合中的数据以及LINQ提供程序的任何其他格式的数据。

11.1.1 LINQ类型

LINQ是Language Integrated Query(语言集成查询)的简称,可以查询数据源包含一组数据的集合对象(IEnumerable<T>或者IQueryable<T>类),返回的查询结果也是一个包含一组数据的集合对象。所以,编译时将对查询的数据类型进行检查,增强了类型安全性。同时使用VS 2012提供的智能提示,使得编码更加快捷。LINQ还可以通过函数的形式提供过滤条件等,大大简化了查询的复杂度。

由于LINQ中查询表达式访问的是一个对象,所以该对象可以表示各种类型的数据源。在.NET Framework类库中,与LINQ相关的类都在System.Linq命名空间下。该命名空间提供支持使用LINQ进行查询的类和接口,其中最常用的有如下类和接口。

(1)IEnumerable<T>接口:它表示可以查询的数据集合,一个查询通常是逐个对集合中的元素进行筛选操作,返回一个新的IEnumerable<T>对象用来保存查询结果。

(2)Enumerable类:它通过对IEnumerable<T>提供扩展方法,实现LINQ标准查询运算符,包括过滤、排序、查询、联接、求和等操作。

(3)IQueryable<T>接口:它继承IEnumerable<T>接口,表示一个可以查询的表达式目录树。

(4)Querable类:它通过对IQueryable<T>提供扩展方法,实现LINQ标准查询运算符,包括过滤、排序、查询、联接、求和等操作。

提示

在学习LINQ之前,读者应该熟悉使用LINQ所需的C#高级特性,如接口、泛型、扩展方法和匿名类型等。

根据数据源类型的不同,LINQ技术可以分为如下4种类型。

(1)LINQ to Objects:查询任何可枚举的集合,如数组、泛型列表和字典等。

(2)LINQ to SQL:查询和处理基于关系数据库的数据。

(3)LINQ to DataSet:查询和处理DataSet对象中的数据,并对这些数据进行检索、过滤和排序等操作。

(4)LINQ to XML:查询和处理基于XML结构的数据。

如图11-1所示描述了LINQ如何关联到其他数据源和高级编程语言。

图11-1 LINQ相关技术描述图

【范例1】

要使用LINQ,首先必须引用与LINQ相关的命名空间。例如,要使用LINQ to XML和LINQ to SQL需要如下的命名空间。

    using System.Linq;
    using System.Xml.Linq;
    using System.Data.Linq;

除了System.Linq命名空间会自动导入之外,其他两个需要用户手动添加。

11.1.2 LINQ查询语句解析

引用LINQ命名空间之后,在C#中可以非常简单地使用LINQ查询。只需将它看作普通的对象编写代码即可。例如,如下的SQL语句从students数据表中查询出学生姓名。在该语句中使用查询关键字来表示特定的功能,包括指定数据源、查询结果、筛选条件等。

    select name from students

在上述语句中select和from是关键字,分别用来指定要查询的结果和数据源。

LINQ中的查询与传统查询类似,同样可以采用具有一定语义的文本来表示。例如,如下是从students数据表中查询出学生姓名的LINQ实现。

    var result = from num in numbers select num;

这种方式在LINQ中称为查询表达式。在这里的from和select都是LINQ中的子句,11.2节将详细介绍这些子句及它们的具体作用。

提示

LINQ中的查询同时是一个类型为IEnumerable<T>或者IQuerable<T>的对象,所以可以通过使用对象的方式使用它,这种方式在LINQ中称为查询方法。

LINQ查询的目的是从指定的数据源中查询满足特定条件的数据元素,并且根据需要对这些元素进行排序、分组、统计及联接等操作。所以,一个LINQ查询应该包含如下几个主要元素。

1.数据源

数据源表示LINQ查询将从哪里获取数据,它通常是一个或者多个数据集,每一个数据集包含一系列的元素。数据集是一个类型为IEnumerable<T>或者IQueryable<T>的对象,可以对它进行枚举,遍历每一个元素。此外,它的元素可以是任意数据类型,所以可以表示任何数据的集合。

2.目标数据

数据源中的元素并不是查询所需要的结果。例如,对于一个学生信息集合,查询1只需要查询学生学号,查询2只需要查询学生姓名和班级编号,查询3则需要学生学号和入学时间。因此,目标数据用来指定查询具体想要的数据,在LINQ中它定义了查询结果数据集中元素的具体类型。

3.筛选条件

筛选条件定义了对数据源中元素的过滤条件。只有满足条件的元素才作为查询结果返回。筛选条件可以是简单的逻辑表达式,也可以是具有复杂运算的函数。

4.附加操作

附加操作表示一些其他的具体操作。例如,对查询的结果进行排序、计算查询结果中的最大值,或者进行分组等。

其中,每个LINQ查询必须具有数据源和目标数据两个元素,筛选条件和附加操作是可选元素。

教程类别