SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession
此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select语句。
using System.Collections.Generic;
using RA.DataAccess.Common; namespace RA.DataAccess
{
public partial class SqlSession<T>
{
public SqlSession()
{
Fields = EntityHelper.GetFields<T>(false);
Field = EntityHelper.GetFiledString<T>();
TableName = EntityHelper.GetTableName<T>();
PrimaryKey = EntityHelper.GetPrimaryKey<T>();
}
/// <summary>
/// 字段,用逗号隔开
/// </summary>
public string Field { get; set; }
/// <summary>
/// 主键
/// </summary>
public string PrimaryKey { get; set; }
/// <summary>
/// 表名
/// </summary>
public string TableName { get; set; }
/// <summary>
/// 字段列表
/// </summary>
public List<string> Fields { get; set; }
/// <summary>
/// 条件表达式
/// </summary>
public string WhereStr { get; set; } = "";
/// <summary>
/// 是否聚合
/// </summary>
public bool IsDistinct { get; set; }
/// <summary>
/// 排序
/// </summary>
public string OrderByStr { get; set; }
/// <summary>
/// 连表字符串
/// </summary>
public string JoinStr { get; set; }
/// <summary>
/// 完整sql
/// </summary>
public string SqlExpression
{
get
{
var sql = "SELECT $distinct " + Field + " FROM " + TableName + " $join$where$orderby"; sql = sql.Replace("$distinct", IsDistinct ? "DISTINCT" : "");
sql = sql.Replace("$join", string.IsNullOrEmpty(JoinStr) ? "" : JoinStr);
sql = sql.Replace("$where", string.IsNullOrEmpty(WhereStr) ? "" : "WHERE " + WhereStr);
sql = sql.Replace("$orderby", string.IsNullOrEmpty(OrderByStr) ? "" : "ORDER BY " + OrderByStr);
return sql;
}
}
}
}
using System;
using System.Linq.Expressions;
using RA.DataAccess.Common; namespace RA.DataAccess
{
public partial class SqlSession<T> where T : class
{
#region Where操作
private void WhereSqlFromExpression(Expression func)
{
if (WhereStr != "")
{
WhereStr = WhereStr + "AND " + ExpressionHelper.GetSqlByExpression(func) + " ";
}
else
{
WhereStr = ExpressionHelper.GetSqlByExpression(func) + " ";
}
}
/// <summary>
/// Where操作,适用于单表查询(exp代表的元素的查询)
/// </summary>
/// <param name="func">表达式</param>
public void Where(Expression<Func<T, bool>> func)
{
WhereSqlFromExpression(func.Body);
}
/// <summary>
/// Where操作,适用于单表查询(Target中元素的查询)
/// </summary>
/// <typeparam name="Target">要查询的另一个表的实体</typeparam>
/// <param name="func"></param>
public void Where<Target>(Expression<Func<Target, bool>> func)
{
WhereSqlFromExpression(func.Body);
}
/// <summary>
/// Where操作,适用于联表查询时的where语句(exp和T元素的关系查询)
/// </summary>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void Where<Target>(Expression<Func<Target, T, bool>> func)
{
WhereSqlFromExpression(func.Body);
}
/// <summary>
/// Where操作,适用于多联表时的where语句(TSource和Target元素之间的关系查询)
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void Where<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
{
WhereSqlFromExpression(func.Body);
} /// <summary>
/// Where操作,适用于多联表时的where语句(多条件,跨表)
/// </summary>
/// <typeparam name="T0"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <param name="func"></param>
public void Where<T0, T1, T2>(Expression<Func<T0, T1, T2, bool>> func)
{
WhereSqlFromExpression(func.Body);
} /// <summary>
/// Where操作,适用于多联表时的where语句(多条件,跨表)
/// </summary>
/// <typeparam name="T0"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <param name="func"></param>
public void Where<T0, T1, T2, T3>(Expression<Func<T0, T1, T2, T3, bool>> func)
{
WhereSqlFromExpression(func.Body);
} /// <summary>
/// Where操作,适用于多联表时的where语句(多条件,跨表)
/// </summary>
/// <typeparam name="T0"></typeparam>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
/// <typeparam name="T3"></typeparam>
/// <typeparam name="T4"></typeparam>
/// <param name="func"></param>
public void Where<T0, T1, T2, T3, T4>(Expression<Func<T0,T1,T2,T3,T4,bool>> func)
{
WhereSqlFromExpression(func.Body);
}
#endregion #region 排序
/// <summary>
/// 按照DESC排序
/// </summary>
/// <param name="func"></param>
public void OrderByDescending(Expression<Func<T, object>> func)
{
OrderByStr = ExpressionHelper.GetSqlByExpression(func.Body) + "DESC ";
} /// <summary>
/// 排序
/// </summary>
/// <param name="func"></param>
public void OrderBy(Expression<Func<T, object>> func)
{
OrderByStr = ExpressionHelper.GetSqlByExpression(func.Body) + " ";
}
#endregion #region 连接
/// <summary>
///join表链接(exp和Target表相连时使用此方法)
/// </summary>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void Join<Target>(Expression<Func<Target,T,bool>> func)
{
var targetfields = "," + EntityHelper.GetFiledString<Target>();
Field += targetfields;
JoinStr += "INNER JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
} /// <summary>
/// join表连接(TSource和Target表相连时使用此方法)
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void Join<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
{
if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
{
throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
}
var targetfields = "," + EntityHelper.GetFiledString<Target>();
Field += targetfields;
JoinStr += "INNER JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
}
#endregion #region 左连接
/// <summary>
/// 左连接
/// </summary>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void LeftJoin<Target>(Expression<Func<Target, T, bool>> func)
{
Field += "," + EntityHelper.GetFiledString<Target>();
JoinStr += "LEFT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
} /// <summary>
/// 左连接(条件中不包括exp)
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void LeftJoin<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
{
if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
{
throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
}
Field += "," + EntityHelper.GetFiledString<Target>();
JoinStr += "LEFT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
}
#endregion #region 右连接
/// <summary>
/// 右连接
/// </summary>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void RightJoin<Target>(Expression<Func<Target, T, bool>> func)
{
Field += "," + EntityHelper.GetFiledString<Target>();
JoinStr += "RIGHT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
} /// <summary>
/// 右连接(条件中不包括exp)
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="Target"></typeparam>
/// <param name="func"></param>
public void RightJoin<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
{
if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
{
throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
}
Field += "," + EntityHelper.GetFiledString<Target>();
JoinStr += "RIGHT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
}
#endregion /// <summary>
/// 排重
/// </summary>
public void Distinct()
{
IsDistinct = true;
}
}
}
SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession的更多相关文章
- SqlHelper简单实现(通过Expression和反射)1.引言
之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...
- SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题
数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...
- 简单十步让你全面理解SQL
很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些人觉得SQL 还是有些类似功 ...
- 【转】简单十步让你全面理解SQL
简单十步让你全面理解SQL 很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些 ...
- ASP.NET通过反射生成sql语句
最近对接一个接口,需要通过xml序列化成实体后添加额外信息后批量插入数据库,需要手动拼sql.因为涉及多张表,拼凑很麻烦而且容易出错,所以写了两个工具方法来生成sql,先写到博客里面,以便以后不时之需 ...
- Mybatis反射修改SQL值
Mybatis反射修改SQL值 某一些情况下我们需要动态的改变Mybtis的执行的sql语句,有两种方法:1)使用拦截器,2)使用反射,拦截器的比较简单点,这里使用反射实现一次,有一点小坑,记录一下: ...
- SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类
这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. ...
- SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类
MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...
- SqlHelper简单实现(通过Expression和反射)10.使用方式
以下是整个SqlHelper的Demo: public Result<List<ArticleDTO>> GetIndexArticleList(int count, int ...
随机推荐
- uva 11381(神奇的构图、最小费用最大流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29821 思路:首先拆点,每个字符对应的位置拆成i和i+len,然后 ...
- js获取表单数据
var modelObj = {}; var modelFieldsArray = $('#AddMusicCategory').serializeArray(); $.each(modelField ...
- JSP小例子——实现用户登录小例子(不涉及DB操作)
实现用户登录小例子用户名和密码都为"admin",登陆成功使用服务器内部转发到login_success.jsp页面,并且提示登陆成功的用户名.如果登陆失败则请求重定向到login ...
- Jquery判断某个标签 Id是否存在
query判断某个标签 Id是否存在, 如果是下面的 jQuery 代码判断一个对象是否存在,是不能用的 if($("#id")){}else{} 因为 $(“#id”) 不管对象 ...
- 170323、Spring 事物机制总结
spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- HDU 1866 A + B forever!
A + B forever! Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- http协议----->请求头和响应头
http实用头字段-----Range 如果请求里有这个range头,那么响应里也有 1.首先在webroot下放好a.txt 内容如下: 2.然后在本地有个下载未完成的a.txt 本地a.txt内容 ...
- HTTP代理服务器基本知识
http://www.cnblogs.com/TankXiao/archive/2012/12/12/2794160.html https://blog.csdn.net/xiaoxiaorenky/ ...
- 【react npm】解决用npmstart启动别人的react项目的问题1:sha1-xxx checksum failed wanted sha1-xxx but got sha512-xxx. (10700 bytes)
1.npm是nodejs的包管理器,相当于php的composer,python的pip,用于安装各种包. 2.一般来说,别人拷给你的react项目不会带依赖包的,因为太大了,需要用npm命令自己安装 ...
- Safe Or Unsafe--hdu2527(哈夫曼树求WPL)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527 用优先队列模拟 #include<iostream> #include<std ...