随笔分类 -  LINQ之路

语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一项创新功能,它在对象领域和数据领域之间架起了一座桥梁。本系列文章旨在对LINQ进行一个完整详细的介绍,内容包含了:LINQ介绍、C# 3.0语言新特性、LINQ to Objects、解释查询(LINQ to SQL/Entity Framework)、LINQ to XML。希望能对学习LINQ的园友们有所帮助,也期待能和大家一起讨论和学习,共同进步!
摘要:本篇提供到LINQ系列之路各篇文章的导航索引 阅读全文
posted @ 2011-12-16 15:34 Life a Poem 阅读(30267) 评论(28) 推荐(45) 编辑
摘要:LINQ之路系列博客后记 阅读全文
posted @ 2011-12-14 10:59 Life a Poem 阅读(5911) 评论(66) 推荐(43) 编辑
摘要:到目前为止,我们已经讨论了如何使用LINQ从一个X-DOM中获取数据。其实,我们同样可以使用LINQ查询来生成一个X-DOM。数据源可以是支持LINQ查询的任何数据,比如: •LINQ to SQL或 Entity Framework查询 •本地集合 •另外一个X-DOM 不管是何种数据源,使用LINQ来产生X-DOM的策略都是一样的:首先写出产生目标X-DOM的函数式构造表达式,然后针对该表达式创建LINQ查询。 阅读全文
posted @ 2011-12-13 11:06 Life a Poem 阅读(3524) 评论(6) 推荐(7) 编辑
摘要:本篇我们会讨论与XML文档相关的另外几个重要概念:Documents、Declarations和Namespaces。一个XDocument封装了根元素并且允许我们添加XDeclaration, processing instructions, 文档类型和其他根级类型对象;一个标准的XML文件总是从一个declaration(声明)开始,它的作用是确保文件会被文件读取器正确的读取和理解;就像.NET类型可以有namespaces(命名空间)一样,XML元素和属性也可以有namespaces,用于对XML文档进行更有效的管理。 阅读全文
posted @ 2011-12-12 17:20 Life a Poem 阅读(6388) 评论(4) 推荐(5) 编辑
摘要:本篇包含两部分内容:X-DOM更新一节中我们会详细讨论LINQ to XML的更新方式,包括Value的更新、子节点和属性的更新、通过Parent节点实现更新; 和Value属性交互一节会详细讨论XElement和XAttribute的Value属性。如果一个元素只有单个XText子节点,那么XElement的Value属性即是对该子节点的快捷方式。对于XAttribute来讲,Value就是指其属性值。X-DOM为XElement和XAttribute的Value属性提供了一致的操作方式。 阅读全文
posted @ 2011-12-09 09:53 Life a Poem 阅读(4361) 评论(5) 推荐(7) 编辑
摘要:正如我们期望的那样,XNode和XContainer类定义了用于遍历X-DOM tree的方法和属性。但是和传统的DOM不同,这些方法并不返回IList集合,而是返回单个值或者实现了IEnumerable的sequence(这样我们就可以对其创建LINQ查询了)。本篇我们会讲述X-DOM的各种导航方法。 阅读全文
posted @ 2011-12-07 10:04 Life a Poem 阅读(9476) 评论(8) 推荐(8) 编辑
摘要:.NET Framework提供了数种操作XML数据的API。从Framework 3.5开始,最重要的用来处理XML文档的技术当属LINQ to XML。LINQ to XML由一个轻量级的XML文档对象模型和一组补充查询运算符组成,并且,该文档对象模型是LINQ友好的。多数情况下,它可以完全取代XML技术的前身:符合W3C规则的DOM,如XmlDocument。现在,就让我们一起开始LINQ to XML的学习之旅,看看它是怎样简化XML的查询与操作,提高我们的工作效率的。 阅读全文
posted @ 2011-12-06 09:57 Life a Poem 阅读(7929) 评论(7) 推荐(13) 编辑
摘要:本篇将是关于LINQ Operators的最后一篇,包括:集合运算符(Set)、Zip操作符、转换方法(Conversion Methods)、生成器方法(Generation Methods)。集合运算符用语对两个sequence进行操作;Zip运算符同步遍历两个sequence(像一个拉链一样),返回的sequence基于在每一个元素对上应用lambda表达式;转换方法用来将实现了IEnumerable的sequence转换到其他类型的集合,或从其他类型的集合转换到sequence;生成器方法/Generation Methods用来创建简单的本地sequence。 阅读全文
posted @ 2011-11-29 10:39 Life a Poem 阅读(10201) 评论(37) 推荐(18) 编辑
摘要:本篇继续LINQ Operators的介绍,包括元素运算符/Element Operators、集合方法/Aggregation、量词/Quantifiers Methods。元素运算符从一个sequence当中获取单个元素;集合方法对sequence进行统计/汇总并返回当个标量值;量词方法用于判断sequence是否满足特定条件并返回bool值。 阅读全文
posted @ 2011-11-28 10:17 Life a Poem 阅读(6181) 评论(16) 推荐(8) 编辑
摘要:本篇继续LINQ Operators的介绍,这里要讨论的是LINQ中的排序和分组功能。LINQ的排序操作符有:OrderBy, OrderByDescending, ThenBy, 和ThenByDescending,他们返回input sequence的排序版本。分组操作符GroupBy把一个平展的输入sequence进行分组存放到输出sequence中。 阅读全文
posted @ 2011-11-25 09:32 Life a Poem 阅读(10862) 评论(5) 推荐(12) 编辑
摘要:Join和GroupJoin通过匹配两个输入sequence来产生单个输出sequence。Join产生平展结果集,而GroupJoin产生层次结果集。Join和GroupJoin提供了Select和SelectMany的替代策略。 Join和GroupJoin的优点是他们对于本地内存集合的执行更加有效,因为他们开始就把内层sequence装载到一个按键排序的查找器,这样就避免了重复的遍历每一个内层元素。他们的缺点则是他们只提供了inner和left out join的功能,而cross joins和不等连接non-equi joins还是只能通过Select/SelectMany来实现。 阅读全文
posted @ 2011-11-22 14:58 Life a Poem 阅读(7663) 评论(9) 推荐(7) 编辑
摘要:本篇继续LINQ Operators的学习,这里我们讨论的是数据转换的两种方式:Select和SelectMany,看似简单常用的两种运算符,却也大有讲究。我们会在本篇详细介绍他们的使用方式和适用的场景,以及它们对于各种连接(Join)的支持方式。 阅读全文
posted @ 2011-11-18 10:06 Life a Poem 阅读(8496) 评论(18) 推荐(15) 编辑
摘要:在本系列博客前面的篇章中,已经对LINQ的作用、C# 3.0为LINQ提供的新特性,还有几种典型的LINQ技术:LINQ to Objects、LINQ to SQL、Entity Framework进行了比较详细的介绍,至此,我们应该了解了各种LINQ技术之间的联系和区别。千里之行始于足下,这些基础理论是理解和使用LINQ的关键。但是我们在前面的文章中对于LINQ查询运算符(LINQ Operators)并没有完整的介绍,这就是接下来这几篇博客中所要做的工作。大家可以按顺序依次对各个LINQ Operators进行学习,也可以把他们看成一个reference,作为参考查询之用。 阅读全文
posted @ 2011-11-16 09:34 Life a Poem 阅读(12536) 评论(21) 推荐(9) 编辑
摘要:在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的关键特性。我们在此关注的是LINQ to SQL和Entity Framework中的”LINQ”部分,并会比较这两种技术的相同和不同之处。通过我们之前介绍的LINQ知识还有将来会讨论的更多LINQ Operators,相信阅者能针对LINQ to SQL和Entity Framework写出优雅高效的查询。为了简单清晰,文中有些地方对LINQ to SQL和Entity Framework进行了缩写,分别为:L2S和EF。 阅读全文
posted @ 2011-11-15 10:08 Life a Poem 阅读(14034) 评论(17) 推荐(12) 编辑
摘要:在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”。在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的关键特性。在本系列文章中,我不准备事无巨细的讨论LINQ to SQL和Entity Framework的方方面面,毕竟那样需要太多的篇幅,也会让我们从LINQ上面转移注意力,况且,园子里也有不少介绍LINQ to SQL和Entity Framework的好文章。我们在此关注的是LINQ to SQL和Entity Framework中的”LINQ”部分,并会比较这两种技术的相同和不同之处。通过我们之前介绍的LINQ知识还有将来会讨论的更多LINQ Operators,相信阅者能针对LINQ to SQL和Entity Framework写出优雅高效的查询。为了简单清晰,文中有些地方对LINQ to SQL和Entity Framework进行了缩写,分别为:L2S和EF。 阅读全文
posted @ 2011-11-10 14:03 Life a Poem 阅读(28197) 评论(30) 推荐(17) 编辑
摘要:LINQ提供了两个平行的架构:针对本地对象集合的本地查询(local queries),以及针对远程数据源的解释查询(Interpreted queries)。 在讨论LINQ to SQL等具体技术之前,我们有必要先对这两种架构进行了解和学习,只有在完全理解了他们的特点和原理后,才能够在LINQ to SQL等的学习过程中做到知其然且知其所以然,才能充分利用本地查询和解释查询的各自优势,写出高效正确的LINQ查询。本篇目的就是试图对解释查询的工作方式和实现原理进行剖析。 简单回忆一下之前我们讨论的本地查询架构,它用来操作实现了IEnumerable的对象集合。本地查询对应Enumerable类的查询运算符,返回装饰sequence以支持延迟执行。在创建本地查询时提供的lambda表达式最终会生成对应IL代码,就像其它C#方法那样。 而解释查询用来操作实现了IQueryable的sequence,并对应Queryable类中的查询运算符,这些运算符会生成运行时能被检测的表达式树,相应的LINQ Provider通过分析表达式树最终得到查询结果。 阅读全文
posted @ 2011-11-07 10:49 Life a Poem 阅读(12724) 评论(54) 推荐(26) 编辑
摘要:在前面的系列中,我们已经讨论了LINQ简单查询的大部分特性,了解了LINQ的支持计术和语法形式。至此,我们应该可以创建出大部分相对简单的LINQ查询。在本篇中,除了对前面的知识做个简单的总结,还会介绍几种创建更复杂查询的方式,让我们在面对更复杂的场景时也能轻松面对,包括:子查询、创建策略和数据转换。 阅读全文
posted @ 2011-10-31 13:21 Life a Poem 阅读(17804) 评论(41) 推荐(26) 编辑
摘要:LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行。这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时)。除了下面两种查询运算符,所有其他的运算符都是延迟执行的:1、返回单个元素或者标量值的查询运算符,如First、Count等;2、下面这些转换运算符:ToArray、ToList、ToDictionary、ToLookup。 阅读全文
posted @ 2011-10-29 14:57 Life a Poem 阅读(13178) 评论(30) 推荐(12) 编辑
摘要:书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression)。 LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询。C# 3.0对于LINQ表达式还引入了声明式的查询表达式,也叫查询语法,通常来讲,它是创建LINQ查询的更加快捷的方式。尽管通过查询语法写出的查询比较类似于SQL查询,但实际上查询表达式的产生并不是建立在SQL之上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensions(列表解析)功能之上。本篇会对LINQ查询语法进行详细的介绍。 阅读全文
posted @ 2011-10-28 15:20 Life a Poem 阅读(18042) 评论(12) 推荐(7) 编辑
摘要:书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression)。 LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方式来创建复杂的查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询。C# 3.0对于LINQ表达式还引入了声明式的查询语法,通过查询语法写出的查询比较类似于SQL查询。本篇会对LINQ方法语法进行详细的介绍。 阅读全文
posted @ 2011-10-27 14:48 Life a Poem 阅读(23453) 评论(32) 推荐(16) 编辑