zoukankan      html  css  js  c++  java
  • 数据操作So easy-LINQ解析

    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%2 ==0
                                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进行查看,内部是怎么实现的。

         

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             List<int> inputArray=new List<int>();
     6             for (int i = 0; i < 10; i++)
     7             {
     8                 inputArray.Add(i);
     9             }
    10             Console.WriteLine("使用Linq方法来对集合对象查询、查询结果为:");
    11             LinqQuery(inputArray);
    12             Console.ReadKey();
    13         }
    14 
    15         private static void LinqQuery(List<int> inputArray)
    16         {
    17             var queryResults = from item in inputArray
    18                 where item%2 == 0
    19                 select item;
    20             foreach (int queryResult in queryResults)
    21             {
    22                 Console.Write(queryResult+" ");
    23             }
    24         }
    25     }

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

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

  • 相关阅读:
    ActiveMQ之Topic
    ActiveMQ之Queue
    ActiveMQ.xml文件的主要配置
    koa/redux middleware 深入解析
    js在工作中遇到的一些问题
    rxjs-流式编程
    端到端测试工具--testcafe
    js match函数注意
    深入js正则
    滚动联动-单独滚动与文档滚动
  • 原文地址:https://www.cnblogs.com/Helius/p/5785981.html
Copyright © 2011-2022 走看看