Linq系列—简介

一、Linq简介
Linq产生背景
在LINQ未出现之前,我们需要掌握很多针对不同数据源查询的接口技术,对于OBJECT集合我们需要进行重复而枯燥的循环迭代。对于数据库我们需要使用诸多T-SQL\PL-SQL之类的数据库查询语言。对于XML我们需要使用XMLDOM编程接口或者XPATH之类的东西,需要我们掌握的东西太多太多,即费力又容易忘。此时LINQ的出现大大减轻了代码的工作量,不在需要对不同的数据对象编写不同数据查询接口,可以通过统一的语言统一的接口就能够查询不同的数据对象。
Linq简介
LINQ简称语言集成查询,设计的目的是为了解决在.NET平台上进行统一的数据查询。
微软最初的设计目的是为了解决对象/关系映射的解决方案,通过简单的使用类似T-SQL的语法进行数据实体的查询和操作。不过好的东西最终都能良性的发展演化,变成了如今.NET平台上强大的统一数据源查询接口。
操作对象
我们可以使用LINQ查询内存中的对象(LINQ to Object)、数据库(LINQ to SQL)、XML文档(LINQ to XML),还有更多的自定义数据源。
学习Linq必须要了解的相关技术
Linq就是一个语法糖,本质不是什么新的技术,只是在已有的技术基础上加以提炼、抽象、封装、不断改进从而形成今天的Linq,如果要学习linq下面技术要有一定了解。
1.泛型
Linq的每个方法有泛型的痕迹。泛型是Linq实现的基础,泛型为linq提供了不同的数据类型可以调用同一个查询方法,
例如:我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。
2. 委托
委托其实就是一个方法的占位符,只要和该委托签名相同的方法都可以使用该委托。有了委托的出现为Linq组件的实现提供了可能,查询linq每一个扩展方法都有委托的痕迹,linq中每一个方法都是以委托作为参数,委托就是占位符,只要签名相同每个方法都可以作为参数传到linq扩展方法中。委托的出现实现了方法可以作为参数传到方法中使用提供了可能。
3.lambda
lambad说白了也就是更高级的匿名方法。在linq方法中每个方法都有委托作为参数传到方法中,而委托说白了就是一个方法的占位符,如果想使用linq的查询语法的时候就需要构造一个方法来填充该占位符。这个岂不是很麻烦,这个为linq查询提供了麻烦,但是Lambda的出现让书写方法变得简单,寥寥代码就能够实现要表达的业务逻辑,为linq的流行提供了便捷。
4. 扩展方法
扩展方法的本意在于不修改对象内部代码的情况下对对象进行添加行为。这种方便性大大提高了我们对程序的扩展性,虽这小小的扩展性在代码上来看不微不足道,但是如果使用巧妙的话将发挥很大的作用。扩展方法对LINQ的支撑非常重要,很多对象原本构建与.NET2.0的框架上,LINQ是.NET3.0的技术,如何在不影响原有的对象情况下对对象进行添加行为很有挑战。
那么我们利用扩展方法就可以无缝的嵌入到之前的对象内部。这样的需求在做框架设计时很常见,最为典型的是我们编写了一个.NET2.0版本的DLL文件作为客户端程序使用,那么我们有需要在服务端中对.NET2.0版本中的DLL对象加以控制。比如传统的WINFORM框架,我们可以将ORM实体作为窗体的控件数据源,让ORM实体与窗体的控件之间形成自然的映射,包括对赋值、设置值都很方便。但是这样的实体经过序列化后到达服务层,然后经过检查进入到BLL层接着进入到DAL层,这个时候ORM框架需要使用该实体作相应的数据库操作。那么我们如何使用.NET3.0的特性为ORM添加其他的行为呢?如果没有扩展方法这里就很无赖了。有了扩展方法我们可以将扩展方法构建与.NET3.0DLL中,在添加对.NET2.0DLL的友元引用,再对ORM实体进行扩展。[王清培版权所有,转载请给出署名]
5. Linq架构的设计理念
linq核心设计原理就是链式设计模式(以流水线般的链接方式设计系统逻辑),学习LINQ的时候,看到连贯的扩展方法陆续登场顿时让我觉得这真是无可挑剔。其实在很多场合下我们也可以借鉴这种设计模式,可以很自然的处理很多比较棘手的问题。比较大胆的设计是业务碎片化后利用链式模式将碎片化后的业务算法进行人为的逻辑重组,如果设计的好的话,将是一道顶级盛宴。由于这篇文章是讲解LINQ的内容,这里我就不多扯它了,后面会有专门的文章来讲解大胆的链式业务流程重组的相关知识。
6. Linq常用T-SQL语句以及和拓展方法的关系
在编写Linq组件的T-SQL语句的时候其实我们书写的T-SQL语句在编译的时候就会编译成对应的linq的扩展方法同时将lambda构建的逻辑代码编译成匿名方法传到拓展方法,具体详情可以看T-sql和拓展方法的联系。
7. 表达式目录树(用数据结构表示逻辑代码)
表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等。你可以对表达式树中的代码进行编辑和运算。这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。
  表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET Framework 之间的互操作性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值