此类是整个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的更多相关文章

  1. SqlHelper简单实现(通过Expression和反射)1.引言

    之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...

  2. SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  3. 简单十步让你全面理解SQL

    很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些人觉得SQL 还是有些类似功 ...

  4. 【转】简单十步让你全面理解SQL

    简单十步让你全面理解SQL 很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些 ...

  5. ASP.NET通过反射生成sql语句

    最近对接一个接口,需要通过xml序列化成实体后添加额外信息后批量插入数据库,需要手动拼sql.因为涉及多张表,拼凑很麻烦而且容易出错,所以写了两个工具方法来生成sql,先写到博客里面,以便以后不时之需 ...

  6. Mybatis反射修改SQL值

    Mybatis反射修改SQL值 某一些情况下我们需要动态的改变Mybtis的执行的sql语句,有两种方法:1)使用拦截器,2)使用反射,拦截器的比较简单点,这里使用反射实现一次,有一点小坑,记录一下: ...

  7. SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类

    这个ExpressionHelper类,是整个SqlHelper中,最核心的一个类,主要功能就是将Lambda表达式转换为Sql语句.同时这个转换过程比较复杂,所以下面详细讲解一下思路和这个类的作用. ...

  8. SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类

    MySql的数据处理类和Sql Server没有太大差别,从思路上来说没有区别,所以此处只是给出代码,不再多加解释了. using System; using System.Configuration ...

  9. SqlHelper简单实现(通过Expression和反射)10.使用方式

    以下是整个SqlHelper的Demo: public Result<List<ArticleDTO>> GetIndexArticleList(int count, int ...

随机推荐

  1. Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache

    在ASP.NET中有两个类都提供缓存支持, 一个是HttpRuntime类的Cache属性, 另一个是HttpContext类的Cache属性. 通过查看这两个属性的类型可以发现其实这两个属性都是Sy ...

  2. 分页技巧_测试并继续改进分页用的QueryHelper辅助对象

    分页技巧_测试并继续改进分页用的QueryHelper辅助对象 QueryHelper.java /** * 用于辅助拼接HQL语句 */ public class QueryHelper { pri ...

  3. ios 将p12文件转换为pem

    cd 到 文件所在目录 执行以下命令,生成ck.pem文件. openssl pkcs12 -in ck.p12 -out ck.pem -nodes

  4. Struts入门(三)深入Struts用法讲解

    访问Servlet API Action搜索顺序 动态方法调用 指定多个配置文件 默认Action Struts 后缀 接收参数 处理结果类型 1.访问Servlet API 首先我们了解什么是Ser ...

  5. Python全栈day28(描述符应用)

    描述符的使用 python是弱类型语言,及参数的赋值没有类型限制,下面通过描述符机制来实现类型限制功能 描述符应用1.py class Typed: def __get__(self, instanc ...

  6. java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序

    4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print(& ...

  7. POJ3150—Cellular Automaton(循环矩阵)

    题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现 ...

  8. 具备双向通行能力的架构对于移动APP属于刚性需求。 WebSocket连接 注册信令

    双向通信使用指南_用户指南(开放 API)_API 网关-阿里云 https://help.aliyun.com/document_detail/66031.html 流程描述 (1) 客户端在启动的 ...

  9. Logstash之时区问题的建议和修改---filter---and duplicate resolution.

    2. logstash es duplicate https://logstash.jira.com/browse/LOGSTASH-1875 https://logstash.jira.com/br ...

  10. [LeetCode] 7.Reverse Integer - Swift

    Reverse digits of an integer. Example1: x = , return Example2: x = -, return - 题目意思:对一个整型进行反转 实现代码: ...