微软免费图书《Introducing Microsoft LINQ》翻译-Chapter1:语言集成(CDPlayer译)

本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。
允许转载,但转载时请注明本版权声明信息,禁止用于商业用途!

博客园:韩现龙


语言集成

语言集成是LINQ最基本的特征。

最显而易见的部分就是在C#3.0和Visual Basi9.0中查询表达式的特征。它允许你书写像下面这样的代码︰

var query =
from c in Customers
where c.Country == "Italy"
orderby c.Name
select new { c.Name, c.City };

而不需要按照如下方式写代码:

var query =
Customers
.Where( c => c.Country == "Italy" );
.OrderBy( c => c.Name )
.Select( c => new { c.Name, c.City } );

由于它使用了一种更加简便的语法描述了对数据的查询,所以很多人把它称作“加糖的语法”。不过,事实它并不像我们看到的这样简单,短短的几行代码却是由很多语言机制与语法来支持的。 在这在这种表象下面,它运用到本地类型推断(local type inference),扩展方法( extension methods), lambda 表达式(lambda expressions), 对象初始化表达式(object initialization expressions), 和 匿名类型(anonymous types)等新技术。 这些机制各自发挥着自己的作用,但是如果你站在一个全局的角度来看这一切,你会发现它们在两个方面都进了一大步︰1.使得向更“声明式”的编码方式转变;2.降低数据和代码之间的“阻抗失谐”。

声明式编程

SQL查询和对应的C# 2.0或Visual Basic 8.0程序中的本地数据过滤操作之间的差别(如: tableor or array for C# or Visual Basic)是什么?用SQL,你会书写以下代码︰

SELECT * FROM Customers WHERE Country = 'Italy'

或许用C#你会这样写:

 

C# 代码花费很长时间读与写, 重点是如何数据表达。 在SQL中,描述你想要“什么”。 在C#中,描述“怎样”获得期望的结果。在SQL中,选择最高效的算法去执行“怎样”的操作 (在C#中表现的更明显)的是查询引擎的责任。 这因为相比C#编译程序上的众多限制,面对“怎样”的操作,SQL查询引擎有更多的优化空间。

提示:前面的C#代码范例实现的功能在.NET 2.0中可以通过Find方法实现,但是对于大多数开发人员,必须的匿名代理语句就不太容易编写了。 不过,范例仅仅为了表现不同编程间的差异。

有了LINQ, C# 和Visual Basic就能编写出更加具有“宣布式”风格的代码了,它的查询通过一种“声明式“的架构基于数据的操作,而不是原有的重复、繁琐的方式。 LINQ允许数据的业务逻辑更直接明了的体现出来,同时这样更加明了的业务逻辑是提供出更高水平服务的基础。例如,让我来思考一下并行的问题 一个SQL查询可以被分成几部门并行运算,完全因为它的数据表扫描算法不存在任何限制条件。 而一个C# foreach 循环很难被拆分为几个循环几部分被不用的进程并行执行。

更多信息:并行的LINQ(PLINQ)是在并行方面的一个研究计划,它可以通过LINQ编写代码来实现。

声明式编程可以很好的利用编译程序提供的服务能和架构,使得代码更容易阅读和维护。 这应该是最重要的特性之一,因为它提高了程序员的开发效率。

例如,假定你想要得到一个应用程序中所有可用的静态方法,返回一个IEnumerable<t>。你能使用LINQ 通过反射机制,写出下面的查询︰ <p><font face="Times">var query =<br> from assembly in AppDomain.CurrentDomain.GetAssemblies()<br> from type in assembly.GetTypes()<br> from method in type.GetMethods()<br> where method.IsStatic<br> &amp;&amp; method.ReturnType.GetInterface( "IEnumerable`1" ) != null<br> orderby method.DeclaringType.Name, method.Name<br> group method by new { Class = method.DeclaringType.Name,<br> Method = method.Name };</font> </p> <p> 而等效的C# 代码不仅更长、难以阅读,可以还更容易产生一些错误。 让我们看看一个没有经过优化的C#代码Listing 1-10。 </p> <p><font color="#800000">Listing 1-10 等价于前面LINQ查询的C#代码</font> </p> <p><font face="Times New Roman">List<string> results = new List<string>();<br>foreach( var assembly in AppDomain.CurrentDomain.GetAssemblies()) {<br> foreach( var type in assembly.GetTypes() ) {<br> foreach( var method in type.GetMethods()) {<br> if (method.IsStatic &amp;&amp;<br> method.ReturnType.GetInterface("IEnumerable`1") != null) {<br> string fullName = String.Format( "{0}.{1}",<br> method.DeclaringType.Name,<br> method.Name );<br> if (results.IndexOf( fullName ) results.Add( fullName );<br> }<br> }<br> }<br> }<br>}<br>results.Sort();</string></string></font> </p> <p> </p> <p><strong>类型检查</strong> </p> <p> 语言集成的另一个重要的特征是类型检查。当数据是由LINQ 操作返回的,那么它用不着再进行那些不安全的转换。看似简短的查询表达式并没有忽略类型检查︰数据都是强类型,无论被查询出来的集合或者返回值中的单个实体。 </p> <p> 在支持LINQ(目前C# 3.0 和Visual Basic 9.0)的语言中,类型检查存在于LINQ每一个细节处理过程中。这使得在编写LINQ查询时,Visual Studio的特性,如智能感知(IntelliSense)和重构(Refactoring)都是可以使用的, 而这些Visual Studio特性对于程序员的开发效率有着重要影响。 </p> <p><strong>不同的类型系统</strong><strong>之间的透明化</strong> </p> <p> 当你考虑Microsoft .NET Framework和SQLServer的类型系统时,你已经意识到他们的不同。 使用LINQ时,你应赋予.NET类型系统更高的优先级,因为这类型系统是所有提供LINQ的开发语言(C# 3.0 和Visual Basic 9.0)都支持的。 或许你会觉得有疑问:大多数的数据都是存放在关系型数据库中,同时你不得不将众多类型在不同的系统间进行转换。 这些问题LINQ早就帮你想到了,它会自动为你处理这些转换,而这些类型系统间的转换几乎让程序员察觉不到。 </p> <blockquote> <p><font color="#808080">更多信息:在不同的类型系统和LINQ之间的转换中存在一切局限性。 关于这些信息会在第5章提到,当然,你可以在产品文文件中找到描述更加详细的类型系统兼容性表。</font></p> </blockquote> <p><strong>译注:</strong> </p> <p><strong>本篇专用词库: </strong> </p> <p><strong>[1] 语言集成 Language Integration<br>[2] 本地类型推断 local type inference <br>[3] 扩展方法( extension methods), <br>[4] lambda 表达式(lambda expressions), <br>[5] 对象初始化表达式(object initialization expressions)<br>[6] 匿名类型(anonymous types)<br>[7] 声明式编程:Declarative Programming<br>[8] 反射:Reflection<br>[9] 类型检查:Type Checking<br>[10] 不同的类型系统的透明化:Transparency Across Different Type Systems<br>[11] 智能感知:IntelliSense<br>[12] 重构:Refactoring</strong> </p> <pre>本篇译者:<a href="http://cdplayer.cnblogs.com/">博客园:CDplayer</a></pre> <pre><hr></pre> <p>上一篇:<a href="http://www.cnblogs.com/hanxianlong/archive/2008/01/24/ms-free-book-introducing-linq-how-linq-works-relational-model-xml-manipulation.html">微软免费图书《Introducing Microsoft LINQ》翻译-Chapter1:LINQ工作原理,关系模型,XML操作</a></p> <p>下一篇:<a href="http://www.cnblogs.com/hanxianlong/archive/2008/01/25/ms-free-book-linq-flavors.html">微软免费图书《Introducing Microsoft LINQ》翻译-Chapter1:LINQ调味料(紫色阴影译)</a></p></t>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值