拼吾爱程序人生

首页 » .Net编程 » Linq » LINQ and Pipeline Pattern
cobra - 2008-8-6 13:01:00
INTRODUCTION
LINQ: Language-Integrated Query是随着.NET 3.5而来的extension。这里不多做介绍了,有兴趣的可以看这里YJingLee有一系列不错的文章,值得一看。

在软件工程中,Pipeline是指有一系列元素组成的一条链,上一个元素的输出是下一个元素的输入。Pipeline Design Pattern也被称作为Pipes and Filters Design Pattern。本文将介绍利用LINQ和C# 3.0的新特性来实现Pipeline 模式


 附件: 您所在的用户组无法下载或查看附件



MAIN
切入正题:假设我有一个GetPosts()方法,获取博客园中所有的Post。我们利用LINQ来实现数据库操作,PostDataContext。因此,在GetPosts这个方法中的代码如下:

 附件: 您所在的用户组无法下载或查看附件


此方法返回的是将是所有的Post,我们可以把这个posts比作为“Raw Data”。由于LINQ的deferred querying的特性,此方法在第一次被调用时,并不会立即执行此取数据的操作,在debug的时候可以看到posts其实是一组SQL语句。在当返回的posts在被Enumerate时,才会真正执行这个SQL语句。我们可以利用这一特性和C# 3.0的extension method来实现Pipeline模式。

写一个Extension method

 附件: 您所在的用户组无法下载或查看附件


用此Extension method就可实现filter的功能

 附件: 您所在的用户组无法下载或查看附件


此IQueryable<Post>就是由Raw Data过滤之后得到的Data 1。由于Deferred Querying, GetPostsByAuthor并不会先从数据库取得所有的数据,再在内存中通过Author来过滤,而是会在数据库中执行有Author过滤条件的SQL语句。

有一点需要注意,在整个Pipeline的中间流程当中,返回的结果需要是IQueryable<T>的,如果返回的是IList<T>, IList<T>来自IQueryable<T>.ToList(), 此ToList方法将会使LINQ执行,此后的操作将会是在内存中执行。

CONCLUSION
.NET 3.0的extension method使得Pipeline Pattern的实现显得更加的自然。LINQ的特性使得这一模式有更高的效率,因为Raw Data并不需要取回数据保存在内存中。当然,执行一个SQL取回的大量的数据保存在内存中以备后用,和分散的多次执行SQL始终是一个需要平衡的的事情。


(文/jun1st  出处/博客园)

 您可能对 [Linq] 的这些文章也感兴趣:

透过LINQSQO看LINQ内部机理
LINQ数据源ASP.NET项目入门
扩展LINQ to SQL以支持批量删除
深入浅出学Linq:Linq to SQL How do I(4)
LINQ to XSD is Back
Linq To Sql 项目从Beta迁移到RTM注意事项
LINQ可视化查询编辑器: VLinq
优秀Linq网站推荐
深入浅出学Linq:Linq to SQL How do I(3)
Linq to sql--使用自定义的SQL语句
1
查看完整版本: LINQ and Pipeline Pattern
Modify by pin5i DZNT_ExpandPackage 2.1.3237 2007-2008 pin5i.com