【极客营】LINQ入门篇—LINQ,类似SQL的集成化查询语言

系列课程视频地址:https://ke.qq.com/course/267924?flowToken=1006068

1、LINQ是什么

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

它在对象和数据之间建立一种对应关系,可以使用访问内存对象的方式查询数据集合,

LINQ使查询成为C# 中一种语言构造,开发人员可以在C#代码中嵌套类似于SQL语句的查询表达式,从而实现数据查询的功能。

LINQ的优势

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

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

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

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

(5)、能够大幅减少过程控制语句的代码块,使代码的可读性和可维护性大幅提高。

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

根据数据源类型,可以将LINQ技术分为以下几个主要的技术方向。

(1)LINQ to Object:数据源为实现了接口Ienumeralbe<T>或IQueryble<T>的内存数据集合,这也是LINQ的基本查询部分。

(2)LINQ to ADO.NET:数据源为ADO.NET数据集合,这里将数据库中的表结构映射到类结构,并通过ADO.NET从数据库中获取到数据集到内存中,通过LINQ进行数据查询。

(3)LINQ to XML:数据源为XML文档,这里通过XElement、XAttribute等类将XML文档加载到内存中,通过LINQ进行数据查询。

LINQ作为一种数据查询编码方式,它本身并不是独立的开发语言,也不能进行应用程序开发,但是在.Net3.5及以上的版本中,可以在C#中集成LINQ查询代码。

在任何源代码文件中,要使用LINQ查询功能,必须引用System.LINQ命名空间,使用LINQto XML要引用System.Xml.LINQ,使用LINQ to ADO.NET要引用System.Data.Linq命名空间。

代码如下:

using System.Linq;

using System.Xml.Linq;

using System.Data.Linq;

2、LINQToObject--查询表达式

2.1 from子句应用

LINQ最具突破性的优势在于将文本查询与对象操作完美集成,它让查询数据和操作对象一样安全和轻松,查询是LINQ的核心概念之一。

LiNQ查询表达式访问的数据源是包含一组数据的集合对象(IEnumerable<T>或IQueryable<T>类型)返回的查询结果也是包含一组数据的集合对象。LINQ还可以通过函数的形式提供过滤条件,从而大大简化了查询表达式的复杂度.

由于LINQ中查询表达式访问的是一个对象,所以该对象本身可以表示各种类型的数据源,比如SQL server数据库、XML文档、ADO.NET数据集合以及内存中的数据集合等。

在.net类库中,LINQ相关类库都在System.Linq命名空间下,该空间下提供支持使用LINQ进行查询的类和接口,其中最主要的两个类和两个接口:

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

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

Enumerable类:它通过对IEnumerable<T>提供从扩展方法,实现LINQ标准查询运算。包括过滤、导航、排序、查询、联接、求和、最大值、最小值等操作。 

Queryable类:它通过对IQueryable<T>提供扩展方法,实现LINQ标准查询运算。包括过滤、导航、排序、查询、联接、求和、最大值、最小值等操作。

传统意义上的数据查询语言,通常是比较易懂,且有一定语义的文本,例如在SQL查询语法中,select student.stuname from student,此处的select用来指定要查询的结果,form用来指定数据源。

LINQ中的查询和传统的查询有很多相似之处,LINQ查询的目的从指定的数据源中查询满足特定条件的数据元素,并且根据需要对这些查询的元素进行排序、连接等操作。LINQ查询包括以下几个主要元素:

(1)    数据源:数据源表示LINQ查询将从哪里查找数据,它通常是一个或多个数据集,每个数据集包含一系列的元素,数据集是一个类型为Ienumeralbe<T>或Iqueryable<T>的对象,可以对它进行枚举、遍历每一个元素,此外它的元素可以是任何数据类型,所以可以表示任何数据的集合。

(2)    目标数据:目标数据用来指定查询的具体想要的是什么数据,数据源中的元素并不一定是查询所需要的结果,

(3)    筛选条件:筛选条件定义了对数据源中元素的过滤条件,只有满足条件的元素才作为查询结果返回

(4)    附加操作:附加操作表示一些其他的具体操作,比如,对查询结果进行排序、计算查询结果的最小值、最大值、求和、对查询结果进行分组等。

其中,数据源和目标数据是LINQ查询的必备元素,筛选条件和附加元素是可选元素。

查询表达式是由查询关键字和对应的操作数组成的表达式整体。查询表达式是查询语言最基本的编写格式,同样LINQ查询表达式是一种直观、简洁的查询代码编写方式,LINQ初体验的案例即是查询表达式。

C#3.0开始为查询表达式提供了一些关键字,如下图:

查询表达式关键字

关键字

功能

From

指定要查找的数据源及范围变量,多个from子句则表示从多个数据源中查找数据

Select

指定查询要返回的目标数据,可以指定任何类型、甚至是匿名类型

Where

指定元素的筛选条件,多个where子句则表示并列条件,必须全部满足才能入选

Orderby

指定元素的排序字段和排序方式,当有多个排序字段时,由字段顺序确定主次关系,可以指定升序和降序两种排序方式

Group

指定元素的分组字段

Join

指定多个数据源的关联方式

数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryalbe<T>的类对象,可以将IEnumerable<T>理解成一个多个元素的列表(或数据库中的表)可以用foreahc遍历它的所有元素,从而完成查询操作。由于是泛型接口,所以通过为数据源指定不同的元素类型,可以表示任何数据集合,在.NET类库中,列表类、集合类、数组等都实现了接口IEnumerable<T>,所以可以将这些数据作为数据源在LINQ查询中使用。

每个LINQ查询都以from子句开始,from子句包括以下两个功能:

(1)    指定查询采用的数据源

(2)    定义一个本地变量,表示数据源中单个元素。

单个from子句的编写格式如下,其中dataSource表示数据源,localVar表示单个元素。

语法:from localVar indataSource

一般情况下,不用为from子句的localVar元素指定数据类型,编译器会根据数据源类型为它分配合适的类型,通常元素类型为IEnumerable<T>的类型T。

建议:如果没有特别需要,建议使用不指定类型的本地变量,让编译器自动根据数据源判断具体的元素类型。

例如:

int[] arr={10,20,50,30,40,60,78};

var q1=from val in arr select val;   //arr为数据源

foreach(var item in q1)

{

   System.Console.WriteLine(item);

}

2.2 select子句应用

在LINQ查询中,select子句和from子句都是必备子句,LINQ查询表达式必须以select或group子句结束。Select子句指定在执行查询时产生结果的数据集中元素的类型。

语法:

Select element;

其中select是关键字,element参数则指定查询结果中元素的类型及初始化方式。

例题1:

学生成绩类LessonScore:

学生Student类:

测试类代码:

注意:通常情况下,不需要为select子句中的元素指定具体数据类型,另外如果查询结果中的元素只是在本函数内临时使用,尽量使用匿名类型,这样可以减少很多不必要的类定义。

2.3 用where子句指定筛选条件

通常一个LINQ查询经常需要对数据源中的元素进行过滤。只有符合条件的元素,才能参与查询结果的计算。在LINQ中,用where子句指定查询的过滤条件

语法:

 Where expression ;

expression是一个逻辑表达式,返回布尔值true/false,当被查询的元素参与表达式运算返回结果为true时,该元素参与查询结果运算。

例题:

注意:where子句中的条件尽量简短易懂,并且还可以通过函数等方式来提供判断条件,当出现多个逻辑的时候,可以考虑使用多个并列的where子句代替。

完整内容请移步至视频:https://ke.qq.com/course/267924?flowToken=1006068

猜你喜欢

转载自blog.csdn.net/geek_nanji/article/details/79397509
今日推荐