此类是整个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. 如何在ChemDraw中输入℃温度符号

    化学反应常常对于温度是有一定要求的,所以用ChemDraw化学绘图工具在绘制化学反应的时候常常会用到℃温度符号.但是一些才接触ChemDraw的用户朋友不知道怎么输入℃.针对这种情况本教程来给大家分享 ...

  2. boost实用工具:创建一个禁止复制的类 noncopyable

    boost的noncopyable允许创建一个禁止复制的类,使用很简单,但很好用!  C++ Code  12345678910111213141516171819202122232425262728 ...

  3. 配置使用TargetFrameworks输出多版本类库

    1.类库右键 2.修改配置 修改前: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <Targe ...

  4. C static 关键字理解

    今天来看一下这么一个程序. #include<stdio.h> int count =1; int fun(void) { static int count =10; return cou ...

  5. Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3

    一.现代操作系统的权限分离: 现代操作系统一般都至少分为内核态和用户态.一般应用程序通常运行于用户态,而当应用程序调用系统调用时候会执行内核代码,此时会处于内核态.一般的,应用程序是不能随便进入内核态 ...

  6. 【BZOJ4726】[POI2017]Sabota? 树形DP

    [BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者 ...

  7. Android ArrayAdapter,BaseAdapter,SimpleAdapter适配器绑定数据方法

    /** * 2017-07-31.Book 类 */ public class Book { public String getName() { return name; } public void ...

  8. kubernetes基础知识:限制POD和容器运行的CPU、内存

    限制运行内存 https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/ 先看一个pod的yaml ...

  9. Servlet------>mvc模式原理图

    常用开发模式: 客户在客户端 访问,发送请求到servlet servlet调用service接口 service实现类调用dao接口 dao接口通过jdbc技术操作数据库,并存储到javabean, ...

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

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