深入浅出谈深入浅出谈LINQ
引子:案例引子:案例
某君被邀为一超市设计数据库,用来存储数据。该君根据该超市中实际出现的对象,设计了Customer, Employee,Order,
Product等表,用来保存相应的客户,员工,订单,货品等。太好了,该君很有oo的思想吗。
如果,你被要求用类及对象,来描述该关系型数据,你该如何做呢?在linq推出之前,ADO.NET被用来做数据访问层。而后,
程序员需要自己去编写事务逻辑层中所出现的类。比如,Customer, Employee,Order, Product等。然后,程序员组装所需的
sql语句,通过ADO.NET,将返回的记录,来初始化Customer等类的对象。在这里,你已经自己动手将Customer表和
Customer类关联了起来。从Linq To Sql的设计来看,它主要是为了解决data!=objects 的问题而产生的。现在,有了Table和
Class之间的映射,数据和对象之间就可以有一个一一对应的关系了。
在Linq To Sql之前,在java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational 持久和查询服务。无论是
Hibernate还是NHibernate,其配置复杂,上手时间长,已经不能适应快速开发的需要。而Linq To Sql的推出,恰恰弥补了它
们的缺点,彻底降低了程序开发门槛。
LINQ,语言级集成查询,语言级集成查询(Language Integrated Query)
经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳
定的发展阶段。程序员现在都已经认同像类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的
技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing
and integrating information )的复杂度的问题。其中两个最主要访问的数据源与数据库和 XML 相关。
LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种
用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据(
relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query
(LINQ) 。
LINQ在开发中的地位在开发中的地位
DLINQ *.dbml文件该属于哪一层,的确Linq to Sql存在问题,DLINQ中,虽然可以在语言层级定义查询逻辑。但是依然没有将
数据库持久化数据映射为领域对象,所以还是一种针对数据库的编程模型。
LINQ是微软将在C# 3.0中将推出的语言集成查询技术,许多人也将LINQ叫做微软的ORM。LINQ不仅仅针对关系数据库,它
只是解决一个问题Data!=Object,也就是说他解决的就是Data=Object.。作为底层框架,可以为ORM实现提供更强大的基础
平台。在Linq之前在.net领域最流行的框架就是Nhibernate。是不是在LINQ之后Nhibernate就要消失呢?答案自然是否定的。
这里有个帖子Microsoft LINQ + NHibernate,在那篇帖子中,作者列举了三大原因:
在DLINQ中,虽然可以在语言层级定义查询逻辑。但是依然没有将数据库持久化数据映射为领域对象,所以还是一种针对数
据库的编程模型。而Nhibernate则可以直接将关系数据映射为领域模型,这是DLINQ的主要问题。
DLINQ不支持继承类的映射。
Nhibernate已经提供了许多帮助进行领域面向对象建模的特征。而DLINQ目前还无法拥有。
而LINQ + NHibernate的好处则是:类型安全的查询,并且能使用智能提示功能!这样可以不用学习HQL了。能获得所有
NHibernate所拥有的能力。假如你已经从数据库中查询出了一个数据集,那么可以使用LINQ来进行过滤,排序和分页操作。
从原理上来说,DLINQ是将Lambda查询表达式解析为SQL语句:DLINQ => SQL,而NHLINQ则是将Lambda查询表达式解析
为HQL语句:NHLINQ => HQL。
开源社区的智慧是无穷的,并且和微软也不是你死我活的关系。反倒应该是一种互相补充的关系。开源社区可以做一个.net
framework这样大的东西Mono,开源社区的这些闪烁的创造性思维火花也为沉闷的软件开发带来了很多灵气。也保持了我们
这些没有多少机会能做创造性工作的普通程序员的一些创作热情! LINQ没有提供在多层应用程序中应用的功能,这一个功能可
以通过序列化Expression Tree 来解决,Expression Tree 就可以通过Remoting或者WCF发布出去,正好有一个开源项目解决
这个问题:http://www.codeplex.com/interlinq。这个项目也包含着上面所说的NHibernate.Linq.
Implementing Linq for NHibernate: A How To Guide - Part 1
LINQ to SQL集成到应用程序中需考虑的一些问题集成到应用程序中需考虑的一些问题
1、LINQ to SQL集成到应用程序中需考虑的一个问题, 到底应该返回IQueryable还是IQueryable? 或许这个列表还应该继续扩
展为T, List, 对于Business Layer来说, 到底应该选择哪一种?
2、需要一个分页功能; 到这一步的时候我又有几个选择, 利用LINQ to SQL可以执行自定义存储过程的功能, 完全自己写, LINQ
to SQL本身已经有API提供了分页功能了,不过只有排序或包含标识列的查询中支持Skip方法, 我有什么理由放弃, 除非性能真的
到了非常Critical的时候, 看看下面的分页API, 多么简单:
return q.Skip((currentPage - 1) * pageSize).Take< Order >(pageSize)