详细解释c# LINQ和LINQ TO SQL的理解
理解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#语言提供了以下子句,供我们在查询中使用:
创建一个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支持的全部方法。这里列举了一些有趣且实用的方法,
本 节我们讨论了标准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的理解