您的位置:首页 > 移动开发

.net下开源轻量级ORM框架Dapper扩展系列2

2014-01-13 11:06 363 查看
在上次的扩展中,有朋友对代码和性能提出了一些批评。因此在今天扩展前我先说明:
我遇到问题,是先解决,再谈优化,如果问题都不能解决,何来优化。所以在全部扩展完成之后,我会进行一次代码重构和一些性能优化(当然是在自己技术能力范围内的哈)
所以暂时我们先放下代码和性能问题,先着手解决问题。

喜闻乐见的扩展又开始了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐