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 }
原文地址:https://www.cnblogs.com/kakura/p/6108993.html