zoukankan      html  css  js  c++  java
  • SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession

    此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select语句。

     1 using System.Collections.Generic;
     2 using RA.DataAccess.Common;
     3 
     4 namespace RA.DataAccess
     5 {
     6     public partial class SqlSession<T>
     7     {
     8         public SqlSession()
     9         {
    10             Fields = EntityHelper.GetFields<T>(false);
    11             Field = EntityHelper.GetFiledString<T>();
    12             TableName = EntityHelper.GetTableName<T>();
    13             PrimaryKey = EntityHelper.GetPrimaryKey<T>();
    14         }
    15         /// <summary>
    16         /// 字段,用逗号隔开
    17         /// </summary>
    18         public string Field { get; set; }
    19         /// <summary>
    20         /// 主键
    21         /// </summary>
    22         public string PrimaryKey { get; set; }
    23         /// <summary>
    24         /// 表名
    25         /// </summary>
    26         public string TableName { get; set; }
    27         /// <summary>
    28         /// 字段列表
    29         /// </summary>
    30         public List<string> Fields { get; set; }
    31         /// <summary>
    32         /// 条件表达式
    33         /// </summary>
    34         public string WhereStr { get; set; } = "";
    35         /// <summary>
    36         /// 是否聚合
    37         /// </summary>
    38         public bool IsDistinct { get; set; }
    39         /// <summary>
    40         /// 排序
    41         /// </summary>
    42         public string OrderByStr { get; set; }
    43         /// <summary>
    44         /// 连表字符串
    45         /// </summary>
    46         public string JoinStr { get; set; }
    47         /// <summary>
    48         /// 完整sql
    49         /// </summary>
    50         public string SqlExpression
    51         {
    52             get
    53             {
    54                 var sql = "SELECT $distinct " + Field + " FROM " + TableName + " $join$where$orderby";
    55 
    56                 sql = sql.Replace("$distinct", IsDistinct ? "DISTINCT" : "");
    57                 sql = sql.Replace("$join", string.IsNullOrEmpty(JoinStr) ? "" : JoinStr);
    58                 sql = sql.Replace("$where", string.IsNullOrEmpty(WhereStr) ? "" : "WHERE " + WhereStr);
    59                 sql = sql.Replace("$orderby", string.IsNullOrEmpty(OrderByStr) ? "" : "ORDER BY " + OrderByStr);
    60                 return sql;
    61             }
    62         }
    63     }
    64 }
      1 using System;
      2 using System.Linq.Expressions;
      3 using RA.DataAccess.Common;
      4 
      5 namespace RA.DataAccess
      6 {
      7     public partial class SqlSession<T> where T : class
      8     {
      9         #region Where操作
     10         private void WhereSqlFromExpression(Expression func)
     11         {
     12             if (WhereStr != "")
     13             {
     14                 WhereStr = WhereStr + "AND " + ExpressionHelper.GetSqlByExpression(func) + " ";
     15             }
     16             else
     17             {
     18                 WhereStr = ExpressionHelper.GetSqlByExpression(func) + " ";
     19             }
     20         }
     21         /// <summary>
     22         /// Where操作,适用于单表查询(exp代表的元素的查询)
     23         /// </summary>
     24         /// <param name="func">表达式</param>
     25         public void Where(Expression<Func<T, bool>> func)
     26         {
     27             WhereSqlFromExpression(func.Body);
     28         }
     29         /// <summary>
     30         /// Where操作,适用于单表查询(Target中元素的查询)
     31         /// </summary>
     32         /// <typeparam name="Target">要查询的另一个表的实体</typeparam>
     33         /// <param name="func"></param>
     34         public void Where<Target>(Expression<Func<Target, bool>> func)
     35         {
     36             WhereSqlFromExpression(func.Body);
     37         }
     38         /// <summary>
     39         /// Where操作,适用于联表查询时的where语句(exp和T元素的关系查询)
     40         /// </summary>
     41         /// <typeparam name="Target"></typeparam>
     42         /// <param name="func"></param>
     43         public void Where<Target>(Expression<Func<Target, T, bool>> func)
     44         {
     45             WhereSqlFromExpression(func.Body);
     46         }
     47         /// <summary>
     48         /// Where操作,适用于多联表时的where语句(TSource和Target元素之间的关系查询)
     49         /// </summary>
     50         /// <typeparam name="TSource"></typeparam>
     51         /// <typeparam name="Target"></typeparam>
     52         /// <param name="func"></param>
     53         public void Where<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
     54         {
     55             WhereSqlFromExpression(func.Body);
     56         }
     57 
     58         /// <summary>
     59         /// Where操作,适用于多联表时的where语句(多条件,跨表)
     60         /// </summary>
     61         /// <typeparam name="T0"></typeparam>
     62         /// <typeparam name="T1"></typeparam>
     63         /// <typeparam name="T2"></typeparam>
     64         /// <param name="func"></param>
     65         public void Where<T0, T1, T2>(Expression<Func<T0, T1, T2, bool>> func)
     66         {
     67             WhereSqlFromExpression(func.Body);
     68         }
     69 
     70         /// <summary>
     71         /// Where操作,适用于多联表时的where语句(多条件,跨表)
     72         /// </summary>
     73         /// <typeparam name="T0"></typeparam>
     74         /// <typeparam name="T1"></typeparam>
     75         /// <typeparam name="T2"></typeparam>
     76         /// <typeparam name="T3"></typeparam>
     77         /// <param name="func"></param>
     78         public void Where<T0, T1, T2, T3>(Expression<Func<T0, T1, T2, T3, bool>> func)
     79         {
     80             WhereSqlFromExpression(func.Body);
     81         }
     82 
     83         /// <summary>
     84         /// Where操作,适用于多联表时的where语句(多条件,跨表)
     85         /// </summary>
     86         /// <typeparam name="T0"></typeparam>
     87         /// <typeparam name="T1"></typeparam>
     88         /// <typeparam name="T2"></typeparam>
     89         /// <typeparam name="T3"></typeparam>
     90         /// <typeparam name="T4"></typeparam>
     91         /// <param name="func"></param>
     92         public void Where<T0, T1, T2, T3, T4>(Expression<Func<T0,T1,T2,T3,T4,bool>> func)
     93         {
     94             WhereSqlFromExpression(func.Body);
     95         }
     96         #endregion
     97 
     98         #region 排序
     99         /// <summary>
    100         /// 按照DESC排序
    101         /// </summary>
    102         /// <param name="func"></param>
    103         public void OrderByDescending(Expression<Func<T, object>> func)
    104         {
    105             OrderByStr = ExpressionHelper.GetSqlByExpression(func.Body) + "DESC ";
    106         }
    107 
    108         /// <summary>
    109         /// 排序
    110         /// </summary>
    111         /// <param name="func"></param>
    112         public void OrderBy(Expression<Func<T, object>> func)
    113         {
    114             OrderByStr = ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    115         }
    116         #endregion
    117 
    118         #region 连接
    119         /// <summary>
    120         ///join表链接(exp和Target表相连时使用此方法)
    121         /// </summary>
    122         /// <typeparam name="Target"></typeparam>
    123         /// <param name="func"></param>
    124         public void Join<Target>(Expression<Func<Target,T,bool>> func)
    125         {
    126             var targetfields = "," + EntityHelper.GetFiledString<Target>();
    127             Field += targetfields;
    128             JoinStr += "INNER JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    129             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    130         }
    131 
    132         /// <summary>
    133         /// join表连接(TSource和Target表相连时使用此方法)
    134         /// </summary>
    135         /// <typeparam name="TSource"></typeparam>
    136         /// <typeparam name="Target"></typeparam>
    137         /// <param name="func"></param>
    138         public void Join<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
    139         {
    140             if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
    141             {
    142                 throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
    143             }
    144             var targetfields = "," + EntityHelper.GetFiledString<Target>();
    145             Field += targetfields;
    146             JoinStr += "INNER JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    147             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    148         }
    149         #endregion
    150 
    151         #region 左连接
    152         /// <summary>
    153         /// 左连接
    154         /// </summary>
    155         /// <typeparam name="Target"></typeparam>
    156         /// <param name="func"></param>
    157         public void LeftJoin<Target>(Expression<Func<Target, T, bool>> func)
    158         {
    159             Field += "," + EntityHelper.GetFiledString<Target>();
    160             JoinStr += "LEFT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    161             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    162         }
    163 
    164         /// <summary>
    165         /// 左连接(条件中不包括exp)
    166         /// </summary>
    167         /// <typeparam name="TSource"></typeparam>
    168         /// <typeparam name="Target"></typeparam>
    169         /// <param name="func"></param>
    170         public void LeftJoin<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
    171         {
    172             if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
    173             {
    174                 throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
    175             }
    176             Field += "," + EntityHelper.GetFiledString<Target>();
    177             JoinStr += "LEFT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    178             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    179         }
    180         #endregion
    181 
    182         #region 右连接
    183         /// <summary>
    184         /// 右连接
    185         /// </summary>
    186         /// <typeparam name="Target"></typeparam>
    187         /// <param name="func"></param>
    188         public void RightJoin<Target>(Expression<Func<Target, T, bool>> func)
    189         {
    190             Field += "," + EntityHelper.GetFiledString<Target>();
    191             JoinStr += "RIGHT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    192             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    193         }
    194 
    195         /// <summary>
    196         /// 右连接(条件中不包括exp)
    197         /// </summary>
    198         /// <typeparam name="TSource"></typeparam>
    199         /// <typeparam name="Target"></typeparam>
    200         /// <param name="func"></param>
    201         public void RightJoin<TSource, Target>(Expression<Func<TSource, Target, bool>> func)
    202         {
    203             if (!Field.Contains(EntityHelper.GetFiledString<TSource>()))
    204             {
    205                 throw new NotSupportedException("联表时还没有联接: " + EntityHelper.GetTableName<TSource>());
    206             }
    207             Field += "," + EntityHelper.GetFiledString<Target>();
    208             JoinStr += "RIGHT JOIN " + EntityHelper.GetTableName<Target>() + " ON ";
    209             JoinStr += ExpressionHelper.GetSqlByExpression(func.Body) + " ";
    210         }
    211         #endregion
    212 
    213         /// <summary>
    214         /// 排重
    215         /// </summary>
    216         public void Distinct()
    217         {
    218             IsDistinct = true;
    219         }
    220     }
    221 }
  • 相关阅读:
    Codeforces Round #614 (Div. 2) D. Aroma's Search
    Codeforces Round #614 (Div. 2) C. NEKO's Maze Game
    Kruskal最小生成树及应用
    Codeforces Round #608 (Div. 2) E. Common Number
    Codeforces Round #607 (Div. 2) D Beingawesomeism
    codeforce Hello 2020 A~E
    Codeforces Round #609 (Div. 2)
    Codeforces Round #607 (Div. 2) C. Cut and Paste
    Codeforces Round #605 (Div. 3) F. Two Bracket Sequences 三维dp
    2019-2020Nowcoder Girl初赛题解
  • 原文地址:https://www.cnblogs.com/kakura/p/6108993.html
Copyright © 2011-2022 走看看