LINQ基础概述

介绍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 i in _query)

            {

Console .WriteLine(i + " " );

            } 

也可以这么写

IEnumerable< int > _query = _scores.Where(x =>  x > 80);

foreach (int i in _query)

            {

Console .WriteLine(i + " " );

            }

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

查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

《你必须知道的.NET》读书笔记:从Hello World认识IL

  IL是.NET框架中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但...

12120
来自专栏我杨某人的青春满是悔恨

委托与回调函数

这一段Swift代码稀疏平常,平常到可能有的同学从未想过这段代码背后做了什么。这里其实使用了一个同样稀疏平常却广为流传的设计模式——delegate模式。Del...

19330
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[避免finaly内的无效代码、避免嵌套异常、避免吃掉异常、注意循环异常处理]

  本文已同步到http://www.cnblogs.com/aehyok/p/3624579.html。本文主要来学习以下几点建议

11010
来自专栏技术博客

Entity Framework Repository模式

如果我们用最原始的EF进行设计对每个实体类的“C(增加)、R(读取)、U(修改)、D(删除)”这四个操作。

19310
来自专栏落影的专栏

iOS开发笔记(一)

前言 iOS开发笔记(一) iOS开发笔记(二) iOS开发笔记(三) iOS开发笔记(四) 《开发笔记》系列记录一些开发中遇到的问题以及思考。 本文主...

33870
来自专栏我杨某人的青春满是悔恨

RxCocoa 源码解析——代理转发

平常我们使用 RxSwift 的时候,一般不会去直接使用 delegate,譬如要处理 tableView 的点击事件,我们会这样:tableView.rx.i...

18320
来自专栏逍遥剑客的游戏开发

多线程调用的封装技巧

30970
来自专栏跟着阿笨一起玩NET

跨线程调用窗体控件

本文转载:http://www.csharpwin.com/csharpspace/11279r6763.shtml

32610
来自专栏大内老A

事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)

在上篇中我们谈到:将一个生命周期较短的对象(对象A)注册到一个生命周期较长(对象B)的某个事件(Event)上,两者便无形之间建立一个引用关系(B引用A)。这种...

20770
来自专栏安恒网络空间安全讲武堂

逆向专题 | Writeup分享二

逆向WP分享二 0x01 Re11 [链接地址](Jarvisoj.com) 我们拿到的是一个ELF文件,在Linux中可执行,我们直接丢进IDA中shift...

25370

扫码关注云+社区

领取腾讯云代金券