LINQ学习(一):LINQ初认识

一、简介
1、什么是Linq?
LINQ(Language Integrated Query) 语言继承查询。
LINQ是一组语言特性和API,可以使用统一的方式编写各种查询。用于保存和检索来自不同数据源的数据,从而消除了编程语音和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。

LINQ总是使用对象,因此可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO.NET数据库以及任何其他可用的LINQ提供程序格式的数据

2、LINQ主要包含三个部分:
1、LINQ to Objects     主要负责对象的查询。
2、LINQ to XML          主要负责XML的查询。
3、LINQ to ADO.NET  主要负责数据库的查询。
         LINQ to SQL
         LINQ to DataSet
         LINQ to Entities

3、LINQ的优势:
1、熟悉的语言:开发人员不必为每种类型的数据源或者数据格式学习心的语言。
2、更少的编码:相比传统的方式,LINQ减少了要编写的代码量。
3、可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松的理解和维护。
4、标准化的查询方式:可以使用相同的LINQ语法查询多个数据库。
5、类型检查:程序会在编译的时候提供类型检查。
6、只能感知提示:LINQ为通用集合提供只能感知提示。
7、整形数据:LINQ可以检索不同形状的数据。

二、为什么要使用LINQ?
举个栗子:现在遇到一个问题,对一个整数类型的数组,找到里面的偶数,并进行降序排序。不使用LINQ我们该如何解决?
1、定义一个整数数组list,用来存放所有的偶数
2、foreach遍历数组,找出给定数组内偶数,将偶数放入list数组
3、sort为升序排序,为了达到降序的目的,所以排序好后需要反转。


使用for循环比较麻烦,并且代码可读性、维护性差。
为了提高代码可读性,以及可维护性,我们使用委托来编写:
1、声明委托
2、定义一个Where方法,传入待处理的数组,委托
3、将foreach封装
4、调用方法时,再实现委托
在此解释下为什么要用委托?
  使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

回归正题,虽然使用了委托增加了代码可读性,但是我们需要代码更紧凑和可读!所以我们引入Lambda表达式查询
下面我们演示如何使用LINQ和Lambda表达式根据特定条件来查询数组
var在此为一个隐式类型,在声明一个变量(并且同时给它赋值)的时候,完全不用指定变量的类型,只要一个var就解决问题了
这样写不仅不会影响性能因为它与显示声明编译后产生的中间语言代码(IL代码)是完全一样的(编译器根据变量的值,推到出变量的类型,才产生的IL代码)
注意:使用var时不能只声明而不赋值,因为不赋值编译器无法推到这个变量是什么类型

注意:此处调用的Where方法为IEnumerable下的方法,并非上面我们自己书写的方法

这样使用LINQ与Lambda表达式来编写代码,是不是变得简洁明了太多?代码变的更为紧凑,可读性更强。

























03-10
### LINQ 的核心概念与查询表达式的编程语言特性 LINQ(Language Integrated Query)作为.NET框架的部分,旨在让开发人员能以声明的方式编写查询语句,适用于C#或VB.NET等高级语言。这技术使开发者可以通过类似于SQL的语言风格来查询和操作多种数据源,包括但不限于内存中的集合、数据库以及XML文档等形式的数据存储[^1]。 #### 查询表达式的特点 查询表达式是LINQ个重要组成部分,它提供了种简洁而直观的方法来进行复杂的数据检索工作。这种表达形式不仅易于理解和书写,而且支持强大的模式匹配能力,允许程序员按照自己的需求灵活地组合各种过滤器、投影和其他转换操作。例如,在C#中可以这样写: ```csharp var result = from student in students where student.Grade > 80 && student.Age < 25 orderby student.Name ascending select new {student.Name, student.Score}; ``` 这段代码展示了如何利用`from`, `where`, `orderby` 和 `select`关键字构建个完整的查询管道,最终返回个新的匿名对象列表,其中只包含满足条件的学生姓名及其分数[^2]。 #### 方法语法 vs 查询表达式 除了上述提到的查询表达式外,LINQ还提供了另种称为方法语法的形式。两者之间存在定的对应关系;实际上,编译器会将查询表达式翻译成相应的方法调用来执行实际的任务。对于某些场景来说,可能更倾向于使用种而非另种,具体取决于个人偏好或者项目的需求特点[^5]。 #### 延迟执行机制 值得注意的是,LINQ采用了延迟执行的设计理念——即直到真正遍历结果集之前都不会触发任何计算过程。这意味着可以在不立即消耗资源的情况下预先定义好系列的操作步骤,并且可以根据实际情况动态调整这些步骤的内容。这样的设计有助于提高性能并简化复杂的业务逻辑处理流程。 #### 实际应用场景举例 考虑这样个简单的例子:假设有个整数列表,想要从中选取前两个大于零但不是偶数的数值,则可以用如下方式实现: ```csharp List<int> numbers = new List<int>{ /* some integers */ }; var filteredNumbers = numbers.Where(n => n > 0 && n % 2 != 0).Take(2); foreach(var num in filteredNumbers){ Console.WriteLine(num); } ``` 这里先通过Where()筛选符合条件的元素,再借助Take()限定数量,最后迭代输出所选的结果[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值