1、LINQ是什么?

LINQ是Language Integrated Query的缩写,即“语言集成查询”的意思。LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包含4个组件--Linq to Objects、Linq to XML、Linq to DataSet和Linq to SQL。

下面简单的介绍一下LINQ的4个组件。

Linq to SQL组件:它可以查询基于关系数据库的数据。其中,微软只实现了对SQL Server数据库的查询,包括对其中数据进行查询、修改和删除等操作。

Linq to DataSet组件:它可以查询DataSet对象中的数据,并能对数据进行增删改查等操作。

Linq to XML组件:该组件可以查询XML文件,在它被提出来之前,C#中使用XPath来对XML进行查询,但该工具没有Linq to XML来得简洁。

Linq to Object组件:这个组件可以查询集合数据,如数组或List等。

2、LINQ好在哪里?

好的地方:LINQ使对数据源的操作变得更加简单、方便和易于理解。

2.1 查询表达式

在说明LINQ的好处之前,需要先了解“查询表达式”。查询表达式必须以from子句开头,并且必须以select或group子句结尾,在第一个from子句和最后一个select或group子句之间,可以包含一个或多个where子句、orderby、join子句。其形式非常类似于SQL语言,只是书写倒了过来。

//查询表达式  var queryExp= from s in collection

select s;

//查询表达式还有另外一种表达方式,即“点标记方式”,var queryExp=collection.Select(s=>s);

至于选择什么方式,就看程序员个人的习惯了。

2.2 使用Linq to Objects查询集合

在LINQ提出之前,一般使用for和foreach查询集合,但这种方式没有LINQ to Objects来得简洁,且不容易添加筛选条件。

//创建查询表达式来获得集合中为偶数的元素
var queryResults= from item in collection
where item% ==
select item;

从以上代码可以看出,使用Linq to Objects来查询集合对象,代码更加简洁了。而且LINQ还方便添加筛选条件,只需要在where子句中添加即可。

2.3 使用Linq to XML 查询XML文件

//创建查询,获取名字为“李四”的元素
var queryResults=from element in xmlDoc.Elements("Person")
where element.Element("Name").Value=="李四"
select element;

从以上代码可以看出,使用Linq to XML查询XML文件,代码明显简洁了很多,只需要一个查询表达式即可。

Linq to DataSet的例子这里就不写了,它的使用方式类似于Linq to Object,只是Linq to DataSet查询的不是集合对象而是DataSet对象。

3、理解LINQ的本质

首先我们先运行一段代码,并用Reflector进行查看,内部是怎么实现的。

  class Program
{
static void Main(string[] args)
{
List<int> inputArray=new List<int>();
for (int i = ; i < ; i++)
{
inputArray.Add(i);
}
Console.WriteLine("使用Linq方法来对集合对象查询、查询结果为:");
LinqQuery(inputArray);
Console.ReadKey();
} private static void LinqQuery(List<int> inputArray)
{
var queryResults = from item in inputArray
where item% ==
select item;
foreach (int queryResult in queryResults)
{
Console.Write(queryResult+" ");
}
}
}

再来看看Reflector反编译出来的代码:

其实在C# 3.0中并没有添加任何新特性,因为对于编译器而言,C# 3.0新特性的代码和以前的代码一样,这对于LINQ也是不例外的。大家可以从IL代码中得出,LINQ表达式是建立在Lambda表达式和扩展方法的基础上的,而Lambda表达式又是建立在委托的基础上的,扩展方法也是属于方法,所以,LINQ的本质还是对方法的调用。

数据操作So easy-LINQ解析的更多相关文章

  1. Atitit.数据操作dsl 的设计 ---linq 方案

    Atitit.数据操作dsl 的设计 ---linq 方案 1.1. sql与api方式1 1.2. Linq方案与stream方案的选择,1 1.3. 前缀表达式 vs 中缀表达式1 1.4. 要不 ...

  2. Linq解析带命名空间、前缀、Soap格式的XML

    关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...

  3. [读书笔记]C#学习笔记六: C#3.0Lambda表达式及Linq解析

    前言 最早使用到Lambda表达式是因为一个需求:如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22};例如只想要这个数组中小于15的元素然后重新组装成一个数组或 ...

  4. C#学习笔记五: C#3.0Lambda表达式及Linq解析

    最早使用到Lambda表达式是因为一个需求:如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22};例如只想要这个数组中小于15的元素然后重新组装成一个数组或者直接 ...

  5. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  6. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  7. Entity Framework 5.0系列之数据操作

    Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...

  8. SNMP常用数据操作

    SNMP常用数据操作 snmp编程中常见的数据类型基本上就是integer32/oct_str(字节数组)/counter64/timeticks/dateAndTime这些.很多其它的比如Truth ...

  9. oracle-2-sql数据操作和查询

    主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是 ...

  10. MapObject shape数据操作

    利用MO 的GeoDataset  .DataConnection  Recordset 进行数据操作 在MO中.使用GeoDataset对象和DataConnection 对象来连接和读取地理数据. ...

随机推荐

  1. Java和C++的区别

    这是一个Java语言和C++语言之间的比较. 目录 [隐藏]  1 设计目标 2 语言特性 2.1 语法 2.2 语义 2.3 资源管理 2.4 库 2.5 运行时 2.6 模板 vs. 泛型 2.7 ...

  2. Windows Azure中对映像的管理及操作

    映像是用作新虚拟机的创建模板的 .vhd 文件.映像是一个模板,因为它与已配置的虚拟机不同,没有计算机名称和用户帐户设置等特定设置.可以通过 Windows Azure 管理门户使用现有映像,或创建您 ...

  3. HW4.9

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. HW2.14

    import java.util.Scanner; public class Solution { public static void main(String[] args) { final dou ...

  5. 【ACM/ICPC2013】树形动态规划专题

    前言:按照计划,昨天应该是完成树形DP7题和二分图.最大流基础专题,但是由于我智商实在拙计,一直在理解树形DP的思想,所以第二个专题只能顺延到今天了.但是昨天把树形DP弄了个5成懂我是很高兴的!下面我 ...

  6. 查看目标文件是否是以-fPIC编译的, ar 打包命令将多个静态库打包到一个里面

    readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)' 上句大多数时候(和平台有关)可以正确判断是否是以fPIC选项编译的,如果输出为空,基本可以表 ...

  7. win32键盘记录 -- 自定义窗口类

    最近学了些关于window api编程的知识,于是琢磨编写一些键盘记录器,能够把输入的按键输出到窗口内,并且实现窗口自动滚动. 封装窗口类使用了GWL_USERDATA字段来保存this指针,比较容易 ...

  8. PTA 08-图7 公路村村通 (30分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...

  9. DevExpress GridControl GridView 导出到 Excel 类

    说明: 1>GridView 导出到 Excel (如果分页,只导出当前页数据) 2>GridView 导出到 Excel 3>方法2可以参考DataTable 导出到 Excel ...

  10. jQuery Mobile方向感应事件

    在现在的智能手机中,都有对方向变换的自动感知功能,比如当手机方向从水平方向切换到垂直方向时,则会触发该事件.在jQuery Mobile中,可以通过orientationchange事件进行绑定,并且 ...