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

博客园:韩现龙


语言集成

语言集成是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#你会这样写:

public List<Customer> ItalianCustomers( Customer customers[] )
{
List<Customer> result = new List<Customer>();
foreach( Customer c in customers ) {
if (c.Country == "Italy") result.Add( c );
}
return result;
}

     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 通过反射机制,写出下面的查询︰

var query =
    from    assembly in AppDomain.CurrentDomain.GetAssemblies()
    from    type in assembly.GetTypes()
    from    method in type.GetMethods()
    where   method.IsStatic
           && method.ReturnType.GetInterface( "IEnumerable`1" ) != null
    orderby method.DeclaringType.Name, method.Name
    group   method by new { Class = method.DeclaringType.Name,
                            Method = method.Name };

    而等效的C# 代码不仅更长、难以阅读,可以还更容易产生一些错误。 让我们看看一个没有经过优化的C#代码Listing 1-10。

Listing 1-10 等价于前面LINQ查询的C#代码

List<String> results = new List<string>();
foreach( var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
    foreach( var type in assembly.GetTypes() ) {
        foreach( var method in type.GetMethods()) {
            if (method.IsStatic &&
                method.ReturnType.GetInterface("IEnumerable`1") != null) {
                string fullName = String.Format( "{0}.{1}",
                                      method.DeclaringType.Name,
                                      method.Name );
                if (results.IndexOf( fullName ) < 0) {
                    results.Add( fullName );
                }
            }
        }
    }
}
results.Sort();

 

类型检查

     语言集成的另一个重要的特征是类型检查。当数据是由LINQ 操作返回的,那么它用不着再进行那些不安全的转换。看似简短的查询表达式并没有忽略类型检查︰数据都是强类型,无论被查询出来的集合或者返回值中的单个实体。

   在支持LINQ(目前C# 3.0 和Visual Basic 9.0)的语言中,类型检查存在于LINQ每一个细节处理过程中。这使得在编写LINQ查询时,Visual Studio的特性,如智能感知(IntelliSense)和重构(Refactoring)都是可以使用的, 而这些Visual Studio特性对于程序员的开发效率有着重要影响。

不同的类型系统之间的透明化

      当你考虑Microsoft .NET Framework和SQLServer的类型系统时,你已经意识到他们的不同。 使用LINQ时,你应赋予.NET类型系统更高的优先级,因为这类型系统是所有提供LINQ的开发语言(C# 3.0 和Visual Basic 9.0)都支持的。 或许你会觉得有疑问:大多数的数据都是存放在关系型数据库中,同时你不得不将众多类型在不同的系统间进行转换。 这些问题LINQ早就帮你想到了,它会自动为你处理这些转换,而这些类型系统间的转换几乎让程序员察觉不到。

更多信息:在不同的类型系统和LINQ之间的转换中存在一切局限性。 关于这些信息会在第5章提到,当然,你可以在产品文文件中找到描述更加详细的类型系统兼容性表。

译注:

本篇专用词库:

[1] 语言集成 Language Integration
[2] 本地类型推断 local type inference
[3] 扩展方法( extension methods),
[4] lambda 表达式(lambda expressions),
[5] 对象初始化表达式(object initialization expressions)
[6] 匿名类型(anonymous types)
[7] 声明式编程:Declarative Programming
[8] 反射:Reflection
[9] 类型检查:Type Checking
[10] 不同的类型系统的透明化:Transparency Across Different Type Systems
[11] 智能感知:IntelliSense
[12] 重构:Refactoring

本篇译者:博客园:CDplayer

上一篇:微软免费图书《Introducing Microsoft LINQ》翻译-Chapter1:LINQ工作原理,关系模型,XML操作

下一篇:微软免费图书《Introducing Microsoft LINQ》翻译-Chapter1:LINQ调味料(紫色阴影译)

posted on 2008-01-25 13:42  是谁啊?  阅读(2268)  评论(0编辑  收藏  举报