Linq系列一:Linq(Language-INtegrated Query)介绍

一.前言:

        写了几遍新特性后,一晃就是一个多月,居然有这么长一段时间没有把学习衔接上,真是郁闷;帮公司做一个小平台,就搞得自己焦头烂额,学习时间也排不出。看来工作能力和学习能力都亟需提高。效率,很重要!
        好了进入正题:上一个系列讲了C#3.0的新特性,为Linq的学习做好了铺垫;接下来的一段时间转入Linq的正式学习,上述新特性也会在介绍的过程中提及到。

二.Linq介绍:

        在我们的软件中,数据的重要性不可言喻,特别是象ERP,CRM等等这类商业应用软件就是围绕着数据转;然而数据的来源各种各样,如存放在内存中的业务对象、存放在xml文件的数据、SqlServer关系数据库...这些数据源的读取操作各不相同,相互之间的转换也不是那么容易;为此VS.Net提供了各种技术来支持这些数据源的操作,如操作数据库的ADO.Net,操作xml文件的API(XmlDocument, XmlReader, XPathNavigator等),以及一些存放在内存中的数据的操作(数组,参数变量,类,泛型等等);如今在C#3.0中提供了一种新技术来整合处理各种数据操作的问题,这就是Linq;
        Linq目标是实现语言与数据的深度结合,Linq以统一的数据访问方式访问各种数据源,以相同的方式读取数据,象SQL语句一样进行查询,而这些都是整合在我们熟悉的编程语言如C#,VB当中,另外Linq是使用强类型,并提供编译时检查和VS的智能感知特性等。

下面我们以SQLServer为数据源,列举一段代码分析一下:      
// ADO.NET中我们会用它提供的SqlConnection, SqlCommand, SqlDataAdapter,SqlReader, DataSet, 和 DataTable等来访问操作数据库 ;
              //使用SqlDataAdapter填充DataSet
            using (SqlConnection conn = new SqlConnection(""))

            {
                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Customers", conn);
                da.Fill(ds);
            }
           //使用SqlDataReader读取数据
            using (SqlConnection connection = new SqlConnection(""))

            {

                connection.Open();
                SqlCommand command = connection.CreateCommand();
                command.CommandText = @"SELECT Name, Country FROM Customers WHERE City = @City";
                command.Parameters.AddWithValue("@City""Paris");

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string name = reader.GetString(0);
                        string country = reader.GetString(1);

                    }
                }
            }
        这段代码中,我们只是一个简单的数据读取,不管是使用SqlDataAdapter还是SqlDataReader都会碰到一些问题:
        1.如果直接在代码里写语句,不能确保语句的正确性,连基本的SQL语句的关键字也不能保证是否书写正确;而在Linq中把一些常用的关键字如Select、from、where等写成扩展方法,确保在编译时提供语句的验证;
        2.查询时使用的参数,和查询返回的结果都是弱类型,而在我们面向对象编程中希望能使用强类型来确保我们程序的正确,这样就需要很多的辅助判断来确保我们传入的参数和得到的结果是符合相应的类型要求;而我们在Linq使用的都是强类型,可以避免这些多余的判断,确保程序能得到编译器的验证,不会等到运行时才捕获到错误;
        3.最大的问题是,这段代码只适合SQLServer使用,如果使用其它数据库(Oracle,MySQL...),或者其它数据源(xml,文本文件...)就会改动较大,或者重新写方法才能使用,而使用Linq可以有效避免这些问题;(在稍后章节会详细提到相关应用)
        使用Linq就如下所示:
 //使用Linq可能就是如下这样一个写法(该处只是简单举例,不一定能正确运行)
 //查询集成到编程语言中

  DataContext db = new DataContext("");

  var getData = from customer in db.GetTable<customers>()
                          where customer.City == "Pairs"
                          select 
new { customer.Name, customer.Country };

        此外LINQ还可以避免使你的编程语言与SQL、XSL或者其他针对特定数据的语言纠缠在一起。LINQ可以使用简单的语法在不同的数据源之间进行查询。

        LINQ作为语言扩展以及作为访问各种数据源的方法
        LINQ为我们编程操作数据提供很多可能。我们将会详述它的三个功能:LINQ to Objects,LINQ to SQL,and LINQ to XML,LINQ的这三种提供者组成了一个工具家庭,它可以被单独使用,也可以一起使用构建强大的解决方案。
        LINQ对新的数据源是开放的。三个主要的LINQProvider是构建在通用LINQ基础上的。这个基础包括一系列的构建块,包括查询运算符,查询表达式和表达式树。其中表达式树允许LINQ工具集可被扩展。
        不同的LINQ可以被创建用来提供访问不同的数据源。LINQ可以操作大量的数据源,包括文件系统,活动目录,WMI,windows日志,或者其它任何数据源或者API。相信我们可以从LINQ的这种功能中受益。实际上除了LINQ to Objects,LINQ to SQL,and LINQ to XML之外,Microsoft已经提供了很多其它LINQ的Provider,其中两个就是LINQ to DataSet AND LINQ to Entities。
        LINQ构建块.

三.Linq概览:

        我们现在基本都是使用面向对象来设计编写软件,在编写的软件中数据是以类、对象的方式存放,然而经常使用的数据源是以关系数据库表、或者xml文档、文件等方式存放;如何读取数据源的数据,转换成我们需要的对象,对象的数据如何持久化到数据源中保存,这些工作在我们日常的编码工作中占据了很大比率,而且这些工作可能是程序中最核心的一部分,稍微有点差错导致的问题都是比较严重的;在Linq出现之前,技术牛人们也意识到这些工作的重要性,写出了许许多多的解决方案,提供了各种各样的ORM映射技术,这些技术确实解决了很多问题,提高了(如代码生成器)生产率,在我们的项目中得到广泛的应用;
        现在编写的软件通常会是多种数据源一起协作,这样就需要在项目中使用各种数据源技术(如ADO.NET,xml,文件读取操作等);而其中比较重要的两点是数据对象化,就是把各种需要的数据,转化成程序能控制的对象;以及对象持久化,就是把程序中的对象持久化保存到数据源中;这就是我们通常ORM技术处理的主要内容,不管是使用现成的ORM技术,还是自己开发框架都需要耗费比较多的时间精力,Linq的出现使得在处理这方面问题上效率和质量有了很好的改善
        看看LINQ的动机和设计目标:
        

目标

动机

集成对象,关系数据和XML

在不同的数据源之间统一查询语法,以避免针对数据源使用不同的语言,为处理不同类型的数据提供单一的处理模型,而不管他们在内存中如何表示

使C# VB具有SQLXQuery的能力

在编程语言中集成查询能力

对语言提供可扩展模型

允许其他编程语言提供实现

对多数据源提供可扩展模型

允许访问其他数据源,而不只是允许访问关系数据库和XML文档

允许其他框架使用LINQ支持自己的需求

类型安全

编译时检查,避免以前只能在运行时发现的错误。编译器会在查询中捕捉错误

丰富的智能感知支持(使用强类型)

帮助开发者使用新语法提高他们编写查询的生产率。

编辑器会指导你编写查询。

调试支持

允许开发者单步调试LINQ查询,并提供丰富的调试信息

C# 1.0 2.0, VB.NET 7.0 and 8.0的基础上编译

重用以前版本的语言提供的丰富特性

可运行在.NET 2.0 CLR

避免产生对新的运行时的需求,产生不必要的开发争论

保持100%的向后兼容

可以在已经存在的WebWindows程序中使用标准和泛型集合,以及数据绑定功能。

        接下来一段时间将会分别对Linq to Objects、Linq to SQL、Linq to XML三部分内容进行详细学习。
        
       
 四.参考资料:
        .初识LINQ
        .走进Linq
posted on 2008-11-25 16:33  lxl  阅读(396)  评论(0编辑  收藏  举报