`
izuoyan
  • 浏览: 9220370 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

LINQ新特性简介及入门教程

阅读更多
出处:http://www.msproject.cn/article/Cs3LinqFeatures.aspx

翻译
Amro KhasawnehUnderstanding LINQ (C#)
flanker译(还请指教啊)

简介


本文主要是关注于LINQ——我认为是VS2008(.NET3.5)中最令人兴奋的特性。LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(LINQ to XML)、Databases(LINQ to SQL、LINQ to Dataset、LINQ to Entities)和对象(LINQ to Objects)。LINQ也是可扩展的,允许你建立自定义的LINQ数据提供者(比如:LINQ to Amazon、LINQ to NHibernate、LINQ to LDAP)。

在这里我会讨论C#3.0中的一些新的语言特性和改进,正是它们使得LINQ变得如此强大,让你可以写出这样的代码:

var result = from c in Customers
             where c.City == Boston"
             orderby c.LastName descending
             select new { c.FirstName, c.LastName, c.Address };

记住,如果你想要使用LINQ,你需要安装Visual Studio 2008(.NET3.5)。

新的语言特性

I/ 自动属性

public class Point {
    private int _x, _y;
    public int X {
        get { return _x; }
        set { _x = value; }
    }
    public int Y {
        get { return _y; }
        set { _y = value; }
    }
}

上面的代码简单的定义了一个拥有两个属性的类。现在,使用VS2008中的C#编译器,我们就可以用自动属性写的更简单,它能自动的生成带有get/set操作的私有域。

public class Point {
    public int X { get; set; }
    public int Y { get; set; }
}

上面的代码可读性更好并且简洁。
(这个特性和LINQ还没有关系)

II/ 局部变量类型

使用这个特性,声明一个局部变量,它的具体类型是通过初始化表达式来推断。这点是通过var关键词完成的(这个使用脚本语言的人应该很熟悉,但它们实际上是有很大区别的)。我们可以写出如下的代码:

var num = 50;
var str = "simple string";
var obj = new myType();
var numbers = new int[] {1,2,3};
var dic = new Dictionary<int,myType>();

编译器会生成IL中间代码,就如同我们编译了下面的代码:

int num = 50;
string str = "simple string";
myType obj = new myType();
int[] numbers = new int[] {1,2,3};
Dictionary<int,myType> dic = new Dictionary<int,myType>();

注意,这里并不存在无类型的变量,也没有推迟类型的绑定。编译器是从右边的赋值语句来自动推断和声明变量的类型的,var关键词是一个强类型的变量引用。

III/ 对象初始化和集合初始化

我们继续使用上面的Point类。假设我们想要这个类的一个实例,我们会建立对象并设置它的属性,代码会是这样子的:

Point p = new Point();
p.X = 0;
p.Y = 0;

现在,使用对象初始化,就可以像这样子来重写:

Point p = new Point() { X = 0, Y = 0 };

这个特性也可以使用在集合上,看看下面这段示例:

List<point></point> points = new List<point></point> {
    new Point { X = 2,  Y = 5 },
    new Point { X = 1, Y = -10 },
    new Point { X = 3, Y = 0 }
};

注意,编译器会产生和上面相等价的长一些的代码,它依次调用Add()方法来在集合里添加元素。

IV/ 匿名类型

这个语言特性让我们可以定义内嵌的类型,而不需要显式地定义一个类型。换句话说,假设我们没有定义Point类,却要使用一个Point对象(即类型是匿名的)。我们可以使用上面提到的对象初始化语法,但不用指定类型名:

var p = new {X = 0, Y = 2};

在VS2008中,你仍然可以使用智能感应。所以如果你继续使用变量p,就会得到这个匿名类型的属性列表。

V/ Lambda表达式

在C#2.0中引入了匿名方法,允许在需要委托的地方写一个代码块。匿名方法提供了函数式程序语言的能力,语法显得很简洁。Lambda表达式提供了一个更简洁的语法来写匿名方法。一个Lambda表达式就是一个参数列表(可以隐式类型),然后是一个=>符号,然后是一个表达式或者一个语句块。

作为一个示例,我们定义一个委托类型MyDeleg:

delegate R MyDeleg(A arg);

然后我们就可以使用匿名方法:

MyDeleg<int,bool> IsPositive = delegate(int num) {
                                   return num > 0;
                               };

我们也可以使用新的Lambda表达式来写:

MyDeleg<int,bool> IsPositive = num => num > 0;

VI/ 扩展方法

扩展方法可以使你来扩展一个已存在的类型,增加它的方法,而无需继承它或者重新编译。所以不像为对象写助手方法,扩展方法可以直接是对象自己的一部分。

一个示例,假设我们想要验证一个string是不是合法的Email地址,我们可以编写一个方法,输入为一个string并且返回true或者false。现在,使用扩展方法,我们可以如下这样做:

public static class MyExtensions {
    public static bool IsValidEmailAddress(this string s) {
        Regex regex = new Regex( @"^[w-.]+@([w-]+.)+[w-]{2,4}___FCKpd___12quot; );
        return regex.IsMatch(s);
    }
}

我们定义了一个带有静态方法的静态类。注意,那个静态方法在参数类型string前面有一个this关键词,这会告诉编译器这个特殊的扩展方法会增加给string类型的对象。于是我们就可以在string中调用这个成员方法:

using MyExtensions;

string email = Request.QueryString["email"];
if ( email.IsValidEmailAddress() ) {
    // ...
}

值得提出的是,LINQ就是使用了System.Linq命名空间中的扩展方法(比如where()、orderby()、select()、sum()、average()等等),而且它定义了标准查询操作符,可以用来查询关系数据库、XML和任何实现了IEnumerable<T>接口的.NET对象。

VII/ 查询语法

查询表达式提供了一个语言集成的语法来查询,它特别像关系和层次查询语言比如SQL和XQuery。使用LINQ操作符(也就是from...where...select)写查询很方便,Visual Studio为它提供了很好的智能感知和编译时的检查支持。
当C#编译器遇到了一个查询语法表达式时,实际上它会被转化为使用扩展方法和Lambda表达式的方法调用。

我们举一个例子来解释这个:

var result = from c in Customers
             where c.City.StartsWith("B")
             orderby c.LastName
             select new { c.FirstName, c.LastName, c.Address };

上面的代码等价于:

var result = Customers.Where( c => c.City.StartsWith("B") )
                      .OrderBy( c => c.LastName  )
                      .Select( c => new { c.FirstName, c.LastName, c.Address } );

使用查询语法的好处还有它会使代码更简单更易读。
同时注意,查询表达式以from开头,以select或者group结尾。

最后注意

C#3.0中新引入的几个特性大多数都仅仅是“编译器技巧”或者“语法糖”,其实编译器生成的IL中间代码和原来的是一样的,这样他们就独立于framework和CLR运行时。但是,他们确实需要某些framework的支持,比如System.Core.dll程序集。这就是为什么扩展方法仍然需要依靠于System.Core.dll里包含的System.Runtime.CompilerServices.ExtensionAttribute。
另一方面,查询表达式只是实现了到扩展方法的映射,它包含在System.Linq, System.Data.Linq和System.Xml.Linq命名空间中。

参考和资源

  • "New Orcas Language Feature" Series by Scott Guthrie: 讲解LINQ的系列文章
  • LINQ Resources:Daniel Moth 写的日志
  • MSDN Magazine (June 2007): 一篇介绍 C# 3.0和 LINQ 的文章
  • Visual Studio Orcas Samples: C#/VB LINQ 示例
  • Future Versions: C# 3.0
  • The LINQ Project: LINQ项目主页
  • 分享到:
    评论

    相关推荐

      linq 学习 Linq To Sql 快速入门中文教程

      **正文** LINQ(Language Integrated Query,语言集成查询)是.NET框架中的一项创新技术,它为C#和VB.NET等编程...提供的文档"Orcas新特性.doc"和"LINQ中文教程.doc"将进一步详述这些概念,建议仔细研读以深化理解。

      LINQ基础教程(中文版) 适合初学者

      说得再明白一些,这是编程语言的一种新特性,能够将数据查询语句集成到编程语言中。目前,LINQ支持的语言有C# 和 VB。 目录: LINQ初体验之LINQ to Object 1 一步一步学Linq to sql(一):预备知识 4 一步一步学...

      linq 入门 培训 教程

      【LINQ 入门培训教程】 LINQ,全称为Language Integrated Query,是.NET框架中引入的一项创新技术,它允许开发者使用一种统一的方式处理各种数据源,如集合、数据库、XML等。LINQ的核心在于将查询表达式直接集成到...

      LINQ中文教程.pdf (比较适合入门)

      LINQ是一种在.NET Framework 3.5及以上版本中引入的新特性,它允许开发者使用类似SQL的语法来查询多种数据源,如内存中的对象集合、XML文档以及关系型数据库。 #### 二、LINQ to Object:数组与集合的高级操作 **...

      vs2008视频教程3:VS2008新特性之LINQ入门

      本篇将深入探讨微软Visual Studio 2008(简称VS2008)中的一个重要新特性——Language Integrated Query(LINQ),这是在VS2008视频教程第三部分中的主要内容。LINQ是.NET Framework 3.5的重要组成部分,它为.NET...

      微软LINQ中文教程

      通过这个中文教程,开发者不仅可以掌握LINQ的基础知识,还能深入了解其在不同场景下的应用,从而提升开发效率和代码质量。无论你是初学者还是有经验的开发者,这都将是一份非常有价值的参考资料。

      LinQ入门教程.pdf

      LINQ:Language Integrated Query 语言集成查询,其本质是对ADO.NET结果集通过反射连同泛型特性转换成对象集,实现OR模型的转换(类似JAVA中Hibernate框架,.NET中的NHibernate),它完全是基于.NET 2.0 的框架。

      LINQ电子教程 C#

      **LINQ(Language Integrated Query,语言集成查询)**是.NET Framework 3.5及更高版本中的一个重要特性,它为C#、Visual Basic等.NET编程语言提供了集成查询能力。LINQ使得程序员可以使用一种统一的查询语法来操作...

      Visual Studio 2008开发新特性系列课程(3):VS2008新特性之LINQ入门

      《Visual Studio 2008开发新特性系列课程(3):VS2008新特性之LINQ入门》 本课程重点聚焦于Visual Studio 2008中的一个重要新增特性——Language Integrated Query(语言集成查询,简称LINQ)。LINQ是.NET Framework...

      .net LINQ入门教程

      **.NET LINQ入门教程** LINQ(Language Integrated Query,语言集成查询)是.NET Framework中的一个强大特性,它为C#和Visual Basic等编程语言提供了内建的查询能力,使得数据查询如同操作本地集合一样简单。这篇...

      Linq入门PPT教程+LinqPad(Linq练习器)

      **Linq入门PPT教程与LinqPad:深入理解与实践** LINQ(Language Integrated Query,语言集成查询)是.NET框架中的一个强大特性,它允许开发者在C#和VB.NET等编程语言中直接进行数据库查询,极大地提高了代码的...

      Linq TO SQL 入门教程

      ### Linq TO SQL 入门教程知识点概览 #### 一、Linq TO SQL 基础概念 - **Linq TO SQL** 是 Microsoft .NET Framework 提供的一种用于简化 SQL 数据库操作的技术。它允许开发者使用类似于 LINQ to Objects 的查询...

      LINQ中文教程合集

      1. **《LINQ中文教程.doc》**:这份文档可能包含了LINQ的基础知识和进阶用法,适合初学者阅读。 2. **《语言集成查询_(LINQ).pdf》**:这本书可能详细讲解了LINQ的设计理念和实际应用,可以帮助理解其背后的原理。 ...

      linq教程,linq

      ### LINQ教程精要 **标题解读:** "LINQ教程,linq"这一标题简明扼要地指出了文章的主要内容,旨在提供一个全面的LINQ教程,帮助读者掌握LINQ的基本概念和操作技巧。 **描述理解:** 描述部分强调了教程的目标——...

      Linq To Sql入门教程

      **Linq To Sql 入门教程** LINQ (Language Integrated Query) 是.NET Framework中的一个强大特性,它允许程序员使用一种直观、类型安全的方式来查询各种数据源。...希望这个基础教程能帮助你快速上手LINQ to SQL。

      LINQ教程中文版(LINQ TO SQL ,LINQ TO XML)

      教程中虽然制作较为粗糙,但作为学习LINQ的基础教材,它能帮助开发者快速理解并掌握这两种技术。通过实际的示例和练习,读者可以深入学习如何利用LINQ to SQL处理关系型数据,以及如何利用LINQ to XML进行XML文档的...

      LINQ中文入门教程

      **LINQ 中文入门教程** LINQ(Language Integrated Query,语言集成查询)是.NET Framework 3.5 引入的一项重要技术,它为C#和VB.NET等编程语言提供了统一的查询接口,使得数据查询更加方便和简洁。本教程旨在帮助...

      LInq入门宝典 Linq To Xml linq to sql

      《LINQ中文教程.doc》可能是其中的一份详细文档,涵盖了LInq的基础知识、LInq To Xml的用法和LInq To Sql的实践。同时,可能还包含了各种示例代码和常见问题解答,帮助读者快速掌握LInq的精髓。《CodePub.Com说明....

      LINQ教程全集完整版

      1. **查询表达式语法**: LINQ引入了一种新的查询语法,使得查询类似于SQL语句,但更接近于自然语言。例如,`from`、`where`、`select`和`group by`等关键字用于构建查询。 2. **泛型接口和方法**: LINQ的基础是实现...

    Global site tag (gtag.js) - Google Analytics