ExpressionContext.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Common;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. namespace SqlSugar
  8. {
  9. ///<summary>
  10. /// ** description:Expression to sql
  11. /// ** author:sunkaixuan
  12. /// ** date:2017/1/14
  13. /// ** email:610262374@qq.com
  14. public class ExpressionContext : ExpResolveAccessory
  15. {
  16. #region Fields
  17. private bool _IsSingle = true;
  18. private IDbMethods _DbMehtods { get; set; }
  19. #endregion
  20. #region Properties
  21. public virtual ExpressionContextCase Case{ get; set; }
  22. public ExpressionOutParameter SugarContext { get; set; }
  23. public IDbMethods DbMehtods
  24. {
  25. get
  26. {
  27. if (_DbMehtods == null)
  28. {
  29. _DbMehtods = new DefaultDbMethod();
  30. }
  31. return _DbMehtods;
  32. }
  33. set
  34. {
  35. _DbMehtods = value;
  36. }
  37. }
  38. public int SubQueryIndex { get; set; }
  39. public int JoinIndex { get; set; }
  40. public int Index { get; set; }
  41. public int ParameterIndex { get; set; }
  42. public string SingleTableNameSubqueryShortName{ get; set; }
  43. public string CurrentShortName { get; set; }
  44. public MappingColumnList MappingColumns { get; set; }
  45. public MappingTableList MappingTables { get; set; }
  46. public IgnoreColumnList IgnoreComumnList { get; set; }
  47. public bool PgSqlIsAutoToLower { get; set; }
  48. public bool? TableEnumIsString { get; set; }
  49. public List<SqlFuncExternal> SqlFuncServices { get; set; }
  50. public Expression RootExpression { get; set; }
  51. public bool IsSingle
  52. {
  53. get
  54. {
  55. return _IsSingle;
  56. }
  57. set
  58. {
  59. _IsSingle = value;
  60. }
  61. }
  62. public bool IsJoin
  63. {
  64. get
  65. {
  66. return !IsSingle;
  67. }
  68. }
  69. public List<JoinQueryInfo> JoinQueryInfos { get; set; }
  70. public ResolveExpressType ResolveType { get; set; }
  71. public Expression Expression { get; set; }
  72. public ExpressionResult Result
  73. {
  74. get
  75. {
  76. if (base._Result == null)
  77. {
  78. this.Result = new ExpressionResult(this.ResolveType);
  79. }
  80. return base._Result;
  81. }
  82. set
  83. {
  84. this._Result = value;
  85. }
  86. }
  87. public List<SugarParameter> Parameters
  88. {
  89. get
  90. {
  91. if (base._Parameters == null)
  92. base._Parameters = new List<SugarParameter>();
  93. return base._Parameters;
  94. }
  95. set
  96. {
  97. base._Parameters = value;
  98. }
  99. }
  100. public virtual string SqlParameterKeyWord
  101. {
  102. get
  103. {
  104. return "@";
  105. }
  106. }
  107. public virtual string SqlTranslationLeft { get { return "["; } }
  108. public virtual string SqlTranslationRight { get { return "]"; } }
  109. public virtual Action<Type> InitMappingInfo { get; set; }
  110. public virtual Action RefreshMapping { get; set; }
  111. public virtual Type SubTableType { get; set; }
  112. public string MethodName { get; set; }
  113. #endregion
  114. #region Core methods
  115. public void Resolve(Expression expression, ResolveExpressType resolveType)
  116. {
  117. this.ResolveType = resolveType;
  118. this.Expression = expression;
  119. BaseResolve resolve = new BaseResolve(new ExpressionParameter() { CurrentExpression = this.Expression, Context = this });
  120. resolve.Start();
  121. }
  122. public void Clear()
  123. {
  124. base._Result = null;
  125. base._Parameters = new List<SugarParameter>();
  126. }
  127. public ExpressionContext GetCopyContext()
  128. {
  129. ExpressionContext copyContext = (ExpressionContext)Activator.CreateInstance(this.GetType(), true);
  130. copyContext.Index = this.Index;
  131. copyContext.InitMappingInfo = this.InitMappingInfo;
  132. copyContext.RefreshMapping = this.RefreshMapping;
  133. copyContext.ParameterIndex = this.ParameterIndex;
  134. copyContext.PgSqlIsAutoToLower = this.PgSqlIsAutoToLower;
  135. copyContext.IsSingle = this.IsSingle;
  136. copyContext.RootExpression = this.RootExpression;
  137. copyContext.TableEnumIsString = this.TableEnumIsString;
  138. copyContext.SugarContext = this.SugarContext;
  139. return copyContext;
  140. }
  141. public ExpressionContext GetCopyContextWithMapping()
  142. {
  143. ExpressionContext copyContext = (ExpressionContext)Activator.CreateInstance(this.GetType(), true);
  144. copyContext.Index = this.Index;
  145. copyContext.ParameterIndex = this.ParameterIndex;
  146. copyContext.MappingColumns = this.MappingColumns;
  147. copyContext.MappingTables = this.MappingTables;
  148. copyContext.IgnoreComumnList = this.IgnoreComumnList;
  149. copyContext.SqlFuncServices = this.SqlFuncServices;
  150. copyContext.InitMappingInfo = this.InitMappingInfo;
  151. copyContext.RefreshMapping = this.RefreshMapping;
  152. copyContext.PgSqlIsAutoToLower = this.PgSqlIsAutoToLower;
  153. copyContext.TableEnumIsString = this.TableEnumIsString;
  154. copyContext.IsSingle = this.IsSingle;
  155. copyContext.RootExpression = this.RootExpression;
  156. copyContext.SugarContext= this.SugarContext;
  157. return copyContext;
  158. }
  159. #endregion
  160. #region Override methods
  161. public virtual string GetLimit() { return null; }
  162. public virtual string GetTranslationTableName(string entityName, bool isMapping = true)
  163. {
  164. Check.ArgumentNullException(entityName, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
  165. if (IsTranslationText(entityName)) return entityName;
  166. isMapping = isMapping && this.MappingTables.HasValue();
  167. var isComplex = entityName.Contains(UtilConstants.Dot);
  168. if (isMapping && isComplex)
  169. {
  170. var columnInfo = entityName.Split(UtilConstants.DotChar);
  171. var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(columnInfo.Last(), StringComparison.CurrentCultureIgnoreCase));
  172. if (mappingInfo != null)
  173. {
  174. columnInfo[columnInfo.Length - 1] = mappingInfo.EntityName;
  175. }
  176. return string.Join(UtilConstants.Dot, columnInfo.Select(it => GetTranslationText(it)));
  177. }
  178. else if (isMapping)
  179. {
  180. var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase));
  181. var name = (mappingInfo == null ? entityName : mappingInfo.DbTableName);
  182. if (name.Contains(SqlTranslationLeft) && name.Contains(SqlTranslationRight))
  183. {
  184. return name;
  185. }
  186. else if (name.Contains("."))
  187. {
  188. return string.Join(".", name.Split('.').Select(it => SqlTranslationLeft + it + SqlTranslationRight));
  189. }
  190. else
  191. {
  192. return SqlTranslationLeft + name + SqlTranslationRight;
  193. }
  194. }
  195. else if (isComplex)
  196. {
  197. return string.Join(UtilConstants.Dot, entityName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
  198. }
  199. else
  200. {
  201. return GetTranslationText(entityName);
  202. }
  203. }
  204. public virtual string GetTranslationColumnName(string columnName)
  205. {
  206. Check.ArgumentNullException(columnName, string.Format(ErrorMessage.ObjNotExist, "Column Name"));
  207. if (columnName.Substring(0, 1) == this.SqlParameterKeyWord|| columnName.Substring(0, 1) == "@")
  208. {
  209. return columnName;
  210. }
  211. if (this.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.IsCorrectErrorSqlParameterName == true)
  212. {
  213. if (IsTranslationText(columnName.Replace(" ", ""))) return columnName;
  214. else
  215. return GetTranslationText(columnName);
  216. }
  217. if (IsTranslationText(columnName)) return columnName;
  218. if (columnName.Contains(UtilConstants.Dot))
  219. {
  220. return string.Join(UtilConstants.Dot, columnName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
  221. }
  222. else
  223. {
  224. return GetTranslationText(columnName);
  225. }
  226. }
  227. public virtual string GetDbColumnName(string entityName, string propertyName)
  228. {
  229. if (this.MappingColumns.HasValue())
  230. {
  231. var mappingInfo = this.MappingColumns.SingleOrDefault(it => it.EntityName == entityName && it.PropertyName == propertyName);
  232. return mappingInfo == null ? propertyName : mappingInfo.DbColumnName;
  233. }
  234. else
  235. {
  236. return propertyName;
  237. }
  238. }
  239. public virtual bool IsTranslationText(string name)
  240. {
  241. var result = name.IsContainsIn(SqlTranslationLeft, SqlTranslationRight, UtilConstants.Space, ExpressionConst.LeftParenthesis, ExpressionConst.RightParenthesis);
  242. return result;
  243. }
  244. public virtual string GetTranslationText(string name)
  245. {
  246. return SqlTranslationLeft + name + SqlTranslationRight;
  247. }
  248. public virtual string GetAsString(string asName, string fieldValue)
  249. {
  250. if (fieldValue.Contains(".*") || fieldValue == "*") return fieldValue;
  251. return string.Format(" {0} {1} {2} ", GetTranslationColumnName(fieldValue), "AS", GetTranslationColumnName(asName));
  252. }
  253. public virtual string GetAsString2(string asName, string fieldValue)
  254. {
  255. if (fieldValue.Contains(".*") || fieldValue == "*") return fieldValue;
  256. return string.Format(" {0} {1} {2} ",fieldValue, "AS", GetTranslationColumnName(asName));
  257. }
  258. public virtual string GetEqString(string eqName, string fieldValue)
  259. {
  260. return string.Format(" {0} {1} {2} ", GetTranslationColumnName(eqName), "=", GetTranslationColumnName(fieldValue));
  261. }
  262. public virtual string GetAsString(string asName, string fieldValue, string fieldShortName)
  263. {
  264. if (fieldValue.Contains(".*") || fieldValue == "*") return fieldValue;
  265. return string.Format(" {0} {1} {2} ", GetTranslationColumnName(fieldShortName + "." + fieldValue), "AS", GetTranslationColumnName(asName));
  266. }
  267. #endregion
  268. }
  269. }