【极客营】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

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC