.net下开源轻量级ORM框架Dapper扩展系列2
2014-01-13 11:06
363 查看
在上次的扩展中,有朋友对代码和性能提出了一些批评。因此在今天扩展前我先说明:
我遇到问题,是先解决,再谈优化,如果问题都不能解决,何来优化。所以在全部扩展完成之后,我会进行一次代码重构和一些性能优化(当然是在自己技术能力范围内的哈)
所以暂时我们先放下代码和性能问题,先着手解决问题。
喜闻乐见的扩展又开始了GO
今天目标:查询扩展
想到组装条件查询语句,开始想的是定义类,用树形结构来表示每一个条件单元(意思是:括号包含的条件,例如:where (id<>''))
但是想到这样处理后,其实在编码使用上会觉得别扭(反正我不习惯),我决定要用括号时自己调用方法直接组装,这样也灵活,逻辑也不复杂。
查询少不了操作符,所以有了如下几个类
枚举:OperationMethod,定义SQL中操作符
View Code
最后是测试方法:
OK,今天的扩展到此结束,后续系列将会对修改、批量修改、删除、批量删除、分页进行扩展
希望大家多多关注,觉得对自己有所帮助或有意见的,欢迎留言,觉得不错的,不要吝啬你的鼠标,点点支持,点点推荐,谢谢啦!!!
再次申明:暂时先放下代码和性能问题,在全部扩展完成之后,我会进行一次尽可能的代码重构和一些性能优化
本次扩展源码:http://pan.baidu.com/s/1o6z33M6
我遇到问题,是先解决,再谈优化,如果问题都不能解决,何来优化。所以在全部扩展完成之后,我会进行一次代码重构和一些性能优化(当然是在自己技术能力范围内的哈)
所以暂时我们先放下代码和性能问题,先着手解决问题。
喜闻乐见的扩展又开始了GO
今天目标:查询扩展
想到组装条件查询语句,开始想的是定义类,用树形结构来表示每一个条件单元(意思是:括号包含的条件,例如:where (id<>''))
但是想到这样处理后,其实在编码使用上会觉得别扭(反正我不习惯),我决定要用括号时自己调用方法直接组装,这样也灵活,逻辑也不复杂。
查询少不了操作符,所以有了如下几个类
枚举:OperationMethod,定义SQL中操作符
/// <summary> /// 查询 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dbs"></param> /// <param name="sql"></param> /// <returns></returns> public static IList<T> Query<T>(this DbBase dbs, SqlQuery sql = null) where T : class { var db = dbs.DbConnecttion; var result = new List<T>(); var sqlStr = CreateQuerySql<T>(dbs, sql); if (sql == null || sql.Param == null) { result = db.Query<T>(sqlStr).ToList(); } else { result = db.Query<T>(sqlStr, sql.Param).ToList(); } return result; } /// <summary> /// 创建查询语句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dbs"></param> /// <param name="sql"></param> /// <returns></returns> private static string CreateQuerySql<T>(DbBase dbs, SqlQuery sql) where T : class { var sqlStr = ""; var tbName = Common.GetTableName<T>(); if (sql == null) { sqlStr = string.Format("SELECT * FROM {0}", tbName); } else { var topStr = "*"; if (sql.TopNum > 0) { if (dbs.DbType == DBType.SqlServer || dbs.DbType == DBType.SqlServerCE) { sqlStr = string.Format("SELECT TOP {0} {1} FROM {2} {3}", sql.TopNum, "*", tbName, sql.Sql); }//----- else if (dbs.DbType == DBType.Oracle) { var wStr = sql.Sql; if (wStr.ToUpper().Contains("WHERE")) { if (wStr.ToUpper().Contains("ORDER BY")) { wStr = wStr.Insert(wStr.ToUpper().LastIndexOf("ORDER BY"), string.Format(" AND ROWNUM <= {0} ", sql.TopNum)); } else { wStr = wStr + string.Format(" AND ROWNUM <= {0} ", sql.TopNum); } } else { if (wStr.ToUpper().Contains("ORDER BY")) { wStr = wStr.Insert(wStr.ToUpper().LastIndexOf("ORDER BY"), string.Format(" WHERE ROWNUM <= {0} ", sql.TopNum)); } else { wStr = wStr + string.Format(" WHERE ROWNUM <= {0} ", sql.TopNum); } } sqlStr = string.Format("SELECT {0} FROM {1} {2}", "*", tbName, wStr); }//----- else { sqlStr = string.Format("SELECT {0} FROM {1} {2} LIMIT {3}", "*", tbName, sql.Sql, sql.TopNum); } } else { sqlStr = string.Format("SELECT {0} FROM {1} {2}", "*", tbName, sql.Sql); } } return sqlStr; }
View Code
最后是测试方法:
[TestMethod] public void QueryNoWhere()//无条件的查询,相当于GetAll { using (var db = CreateDbBase()) { var result = db.Query<Account>(); Console.WriteLine("查询出数据条数:" + result.Count); } } [TestMethod] public void Query()//条件查询 { using (var db = CreateDbBase()) { var d = SqlQuery<Account>.Builder(db).AndWhere(m => m.Age, OperationMethod.Less, 20) .LeftInclude()//此表示左括号,所以后面必须有右括号与之对应 .AndWhere(m => m.CreateTime, OperationMethod.Greater, DateTime.Now.AddDays(-5)) .OrWhere(m => m.Name, OperationMethod.Contains, "张") .RightInclude()//右括号 .Top(10)//前10条 .AndWhere(m => m.Age, OperationMethod.In, new List<int>() { 15 }) .OrderBy(m => m.Age, true); //WHERE Age < @para_1 AND ( CreateTime > @para_2 OR Name LIKE @para_3 ) AND Age IN @para_4 ORDER BY Age DESC var result = db.Query<Account>(d); Console.WriteLine("查询出数据条数:" + result.Count); } }
OK,今天的扩展到此结束,后续系列将会对修改、批量修改、删除、批量删除、分页进行扩展
希望大家多多关注,觉得对自己有所帮助或有意见的,欢迎留言,觉得不错的,不要吝啬你的鼠标,点点支持,点点推荐,谢谢啦!!!
再次申明:暂时先放下代码和性能问题,在全部扩展完成之后,我会进行一次尽可能的代码重构和一些性能优化
本次扩展源码:http://pan.baidu.com/s/1o6z33M6
相关文章推荐
- .net下开源轻量级ORM框架Dapper扩展系列3
- .net下开源轻量级ORM框架Dapper扩展系列4(重构与优化)
- C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架
- 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce
- Windows Shell扩展系列文章 1 - .NET 4 编写Windows Shell上下文菜单扩展
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
- .NET开源项目的前世和今生系列 之 .NET开源压缩文档处理的前世和今生
- 【开源系列】三国演义LBS (十)源码:ORM框架
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
- .NET开源项目的前世和今生系列 之 .NET开源压缩文档处理的前世和今生
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
- 轻量级的.Net ORM框架介绍
- 轻量级ORM框架Dapper应用一:Dapper安装
- [.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现
- DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架
- C# WinForm开发系列之c# 通过.net自带的chart控件绘制饼图,柱形图和折线图的基础使用和扩展
- ASP.NET Core 2.0系列学习笔记-ORM框架之Dapper
- .Net开源SqlServer ORM框架SqlSugar整理
- 轻量级ORM框架Dapper应用六:Dapper支持存储过程
- 基于.NET 2.0的GIS开源项目SharpMap分析手记(六):SharpMap的功能扩展之路