LINQ基础概述

简介: 介绍LINQ基础之前,首说一下LINQ 的历史和LINQ是什么,然后说一下学习 LINQ要了解的东西和 LINQ基础语法   LINQ 的历史 从语言方面的进化 –委托 –匿名方法 –Lambda表达式 –Linq查询表达式 上边这四个我会在下边一一解说 从时间方面的演进 –2004年 –2005年9月,C#2.
介绍LINQ基础之前,首说一下LINQ 的历史和LINQ是什么, 然后说一下学习  LINQ 要了解的东西和  LINQ 基础语法
 
LINQ  的历史

从语言方面的进化
委托
匿名方法
Lambda表达式
Linq查询表达式

上边这四个我会在下边一一解说

从时间方面的演进
–2004年
–2005年9月,C#2.0的PDC上发布
–2005年11月,C#2.0预览版
–2006年1月,VB8.0预览版
–2007年11月,.net 3.5发布

LINQ 是什么

LINQ是语言级集成查询(Language INtegrated Query)
LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询
LINQ的目标是降低访问数据的复杂度
LINQ可以用统一的方法访问不同类型的数据,可以将数据作为对象使用
能够更好地与编程模型集成
可以在Visual Studio中进行智能提示
动态编程

LinQ目的

面向对象技术诞生以来并没有解决降低访问和整合信息数据的复杂度的问题。其中两个最主要访问的数据源与数据库和 XML 相关。

使用LINQ的目的是为了提供一个解决对象关系映射问题的方案,同时简化对象和数据源的交互。LINQ最终发展成为一个通用语言集成查询的工具包。

LINQ正如它的名字“集成查询语言”的含义一样,它提供给程序员一个统一的编程界面。程序员不需要关心他将要操作的将是关系数据库还是XML,甚至是远程的对象,它都采用同样的查询方式。就如同通过T-SQL操纵数据库一样,不管是Oracle,SyBase还是SQL Server,他们的Select语法都是一样的。

有了LINQ,程序员便可以不再沉泥于不同的数据访问技术的学习。不管编程语言如何发展,还是数据库技术的发展,都不再需要程序员进行学习,数据存储的效率由数据库厂商进行优化,灵活的数据操作方法由数据访问中间件厂商提供,程序员只需要编写业务逻辑。

 

LINQ包括:
–LINQ to Objects 用于对象的查询
–LINQ to XML 对XML数据的查询
–LINQ to ADO.NET 对数据库的查询
     LINQ to DataSets 数据集
     LINQ to Entities ORM对象
     LINQ to SQL 简易ORM框架
命名空间在System.Linq
实现 IEnumerable<T> 或 IQueryable<T> 接口的对象都可使用LINQ操作

LINQ框架图

 
委托
委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。
委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法
public   delegate  void   MyF1 (  int  a);
 
public   void  M1(  int  a)
  {
              Console  .WriteLine(a);
  }
   MyF1  _myf1 =  M1  ;
  myf1(3);
与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。 方法可以是静态方法,也可以是实例方法。 这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。 只要知道委托的签名,就可以分配您自己的方法。
 
匿名方法
我们在使用一个方法的时候, 一般情况下我们会先把方法名、参数、返回值
写出来也称做命名方法
int MyMethod(int a){}
匿名方法的意思就是不用给定方法的名称。允许我们定义委托对象可以接收的代码
上边的委托我们可以写成
MyF1  _f =  delegate  (  int  a)
                {
                     Console  .WriteLine(a);
                };
            _f(1);
例button的点击事件
通常的写法是
button1.Click += button1_Click;
void  button1_Click( object  sender,  EventArgs  e)
        {
             MessageBox .Show( "Click!"  )
        }
用匿名方法可以这样
button1.Click +=  delegate (  object  obj1,  EventArgs  e)
                {
                     MessageBox  .Show( "Click!"  );
                };
 
 
Lambda 表达式
lambda 取代的匿名方法
Lambda 表达式是一个可用于创建委托或表达式树类型的匿名函数。 通过使用 lambda 表达式,可以写入可作为参数或返回为函数调用值的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。
若要创建 Lambda 表达式,必须在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方。 
我们还是用上边的delegate例子:
MyF1  _my1 = a =>
                {
                     Console  .WriteLine(a);
                };
_my1(3);
Button的点击事件可以写成这样
button1.Click += (obj1, obje2) =>
                {
                     MessageBox .Show( "Click!"  );
                };
 
Linq的基本语法
所有 LINQ 查询操作都由以下三个不同的操作组成:
获取数据源。
创建查询。
执行查询。
查询表达式必须以 from 子句开头,并且必须以 select 或 group 子句结尾。 在第一个 from 子句和最后一个 select 或 group 子句之间,查询表达式可以包含一个或多个下列可选子句:where、orderby、join、let 甚至附加的 from 子句。 还可以使用 into 关键字使 join 或 group 子句的结果能够充当同一查询表达式中附加查询子句的源。
     int [] _scores =  new   int  [] { 97, 92, 81, 60 };           
             IEnumerable  < int  > _query =
                 from  score  in  _scores
                 where  score > 80
                 select  score;           
             foreach  ( int  in  _query)
            {
                 Console  .WriteLine(i +  " "  );
            } 
也可以这么写
   IEnumerable <  int  > _query = _scores.Where(x =>  x > 80);
             foreach  ( int  in  _query)
            {
                 Console  .WriteLine(i +  " "  );
            }
 

下图显示了完整的查询操作。 在 LINQ 中,查询的执行与查询本身截然不同;换句话说,如果只是创建查询变量,则不会检索任何数据。

完整的 LINQ 查询操作
查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”
目录
相关文章
|
存储 C语言
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
246 1
|
存储 监控 数据可视化
在Windows下使用JMeter集群+Influxdb存储+Grafana实时数据展示
在Windows下使用JMeter集群+Influxdb存储+Grafana实时数据展示
756 0
在Windows下使用JMeter集群+Influxdb存储+Grafana实时数据展示
|
SQL 分布式计算 Java
spark 对于hive metastore的兼容性随笔--通过classloader实现
spark 对于hive metastore的兼容性随笔--通过classloader实现
607 0
|
算法 网络协议 Dubbo
SOFAMesh中的多协议通用解决方案x-protocol介绍系列(2):快速解码转发
在 SOFAMesh 的开发过程中,针对遇到的实际问题,我们给出了一套名为 x-protocol 的解决方案,本文将会对这个解决方案进行详细的讲解,后面会有更多内容,欢迎持续关注本系列文章。
1552 0
|
12天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
存储 人工智能 搜索推荐
终身学习型智能体
当前人工智能前沿研究的一个重要方向:构建能够自主学习、调用工具、积累经验的小型智能体(Agent)。 我们可以称这种系统为“终身学习型智能体”或“自适应认知代理”。它的设计理念就是: 不靠庞大的内置知识取胜,而是依靠高效的推理能力 + 动态获取知识的能力 + 经验积累机制。
379 133
|
11天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
474 131
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话