cuclife.com > IT > C# > 0

详细解释c# LINQ和LINQ TO SQL的理解

网络整理 - 06-27

理解LINQ

终于,我们要讨论最后一个话题LINQ了,在这之后我们就可以开始研究本章的真正内容——LINQ to SQL了。

LINQ是Language Integrated Query的简称,它由C#和VB.NET的一系列新特性组成,这些特性允许我们执行查询。LINQ使得SQL查询就像C#或VB.NET的语法一样简单。

一个简单的LINQ查询示例如下,

var words = new List<string> {“zephyr”, “apple”, “azure”};

var results = from w in words

where w.Contains(“z”)

select w;

第一条语句创建了一个泛型列表words,它包含三个字符串。第二条语句就是LINQ查询。

LINQ查询及其像反向的SQL语句。它从列表中获得所有的包含字母z的单词。执行该查询,results变量将包含一下两个单词:

zephyr

azure

你可以对所有实现了IEnumerable<T>接口的对象执行标准的LINQ查询。这些实现了该接口的对象称为sequence。常用的sequence均为泛型List类或标准Array类(因此任何可以存入数组中的类,都可以使用LINQ进行查询)。

C#语言提供了以下子句,供我们在查询中使用:

  • from——指定数据源以及用来迭代数据源的变量(范围变量)。
  • where——过滤查询的结果。
  • select——指定查询结果中的项。
  • group——通过某一关键字,对相关的值进行聚合。
  • into——存储聚合中的结果,或连接到一个临时变量。
  • orderby——将查询结果按升序或降序进行排序。
  • join——通过一个关键字,对两个数据源进行连接。
  • let——创建一个临时变量,来存储子查询的结果。
  • 创建一个LINQ查询,类似于创建一个反向的SQL查询。LINQ查询以一个from子句开始,它指定了数据的位置。然后,指定where子句来过滤数据。最后,指定用来表示数据的select子句(决定你要返回的对象和属性)。

    在内部,标准LINQ查询被翻译成调用System.Linq.Enumerable类的方法。Enumerable类包含了一些扩展方法,这些扩展方法可以应用到任何实现了IEnumerable<T>接口的类中。

    因此,查询

    var results = from w in words

    where w.Contains(“z”)

    select w;

    将被C#编译器翻译成下面的查询

    var results = words.Where( w => w.Contains(“z”) ).Select( w => w );

    第一个查询使用了查询语法(query syntax),第二个查询使用了方法语法(method syntax)。这两种查询是相同的。

    注 意,使用方法语法的查询在Where()和Select()方法中允许使用Lambda表达式。Where()方法中的Lambda表达式用来过滤数据, 只返回包含字母z的单词。Select()方法指明要返回的对象和属性。如果我们将Lambda表达式w=>w.Length传递给 Select()方法,该查询将返回每个单词的长度,而不是单词本身。

    在创建LINQ查询时,使用查询语法还是方法语法纯粹属于个人偏好。查询语法属于语言的特性(C#或VB.NET),方法语法和语言无关。

    我发现我使用方法语法的时候更多一些,因为查询语法不过是方法语法的子集。也就是说,使用方法语法可以做更多的事情。然而在某些情况下,使用方法语法编写查询会显得有些冗长。例如,使用查询语法编写LINQ to SQL左外连接,要比使用方法语法简单得多。

    最后,选择方法语法还是查询语法其实并不重要,因为所有的查询语法语句都将被编译器翻译成方法语法。在使用标准LINQ时,这些调用的方法都存在与Enumerable类中。

    在SDK文档中查找System.Linq.Enumerable类可以浏览Enumerable支持的全部方法。这里列举了一些有趣且实用的方法,

  • Aggregate()——对序列中的每一项执行同一个函数。
  • Average()——返回序列中每一项的平均值。
  • Count()——返回序列的总项数。
  • Distinct()——返回序列中不同的项。
  • Max()——返回序列中的最大值。
  • Min()——返回序列中的最小值。
  • Select()——返回序列中的某些项或属性。
  • Single()——返回序列中的某个单一值。
  • Skip()——跳过序列中指定数目的项并返回剩下的元素。
  • Take()——返回序列中指定数目的元素
  • Where()——过滤序列中的元素。
  • 本 节我们讨论了标准LINQ(也叫LINQ to Objects)。LINQ使用了Provider Model,它有很多不同的实现,包括LINQ to SQL、LINQ to XML、LINQ over DataSets以及LINQ to Entities。LINQ也有很多第三方实现,包括LINQ to NHibernate和LINQ to SharePoint。这些不同的实现可以用来查询不同的数据源,如XML文件、SharePoint列表等等。

    在本章,我们仅讨论LINQ to SQL,它是微软专门为操作数据库数据而设计的官方版本。

    c# LINQ和LINQ TO SQL的理解