ASP.NET设计模式之Query Object模式
当我们应用Repository模式作为数据仓储时,如果我们不使用Query Object模式,那么我们的Repository将会充满大量的检索方法,如下:
1.构建条件操作符枚举
private string CreatePageSql(string fields, string orderBy, string where){ return string.Format("SELECT {0} FROM (SELECT ROW_NUMBER() OVER ({1}) AS [ROW_NUMBER],{0} FROM [{3}users] AS [t0] {2}) " + "AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @pageindex*@pagesize + 1 AND @pageindex + @pagesize", fields, orderBy, where, BaseSettings.GetTablePrefix());}参考书籍《ASP.NET设计模式》这是翻译版的原版为《Professional ASP.NET Design Patterns》,书上的是结合了EF和NH写法有点不一样。还有书上的只是简单的写了个结构,也许是为了讲解方便吧。按书上的写法,动态生成SQL只能支持单一排序并且不支持In查询,我算是扩展了一点了吧
说说Query Object的优缺点,从网上找到的。
查询对象的好处
1、完全将底层数据库的查询语言抽象出来,因此将数据库持久化和检索的基础设施关注点从业务层中分离出来。
2、对于多个数据库,通过设计查询对象,根据运行的数据库来产生不同的sql,屏蔽了各种不同sql语法中的差别。
3、消除对数据库的查询冗余,如果在先前的会话中运行过相同的查询,可以使用查询对象从标志映射中选取对象。
其他的两点都明白,就第三点没明白,懂得朋友解释解释。
缺点没说,我来说说吧。
1.不能生成繁杂的查询,如连表查询,当然可以使用存储过程,问题在于不是所用的数据库都支持存储过程
2.命名查询时的把存储过程的名称添加到QueryName枚举中,是不是有点不方便呢?
本人才开始学习设计模式,以上是个人的愚见,望高手赐教。
点击下载Demo