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

2023-11-05 15:10

本文主要是介绍【极客营】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

这篇关于【极客营】LINQ入门篇—LINQ,类似SQL的集成化查询语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350672

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分