OscarExpressionContext.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using System;
  2. using System.Linq;
  3. namespace SqlSugar
  4. {
  5. public class OscarExpressionContext : ExpressionContext, ILambdaExpressions
  6. {
  7. public SqlSugarProvider Context { get; set; }
  8. public OscarExpressionContext()
  9. {
  10. base.DbMehtods = new OscarLMethod();
  11. }
  12. public override string SqlTranslationLeft
  13. {
  14. get
  15. {
  16. return "\"";
  17. }
  18. }
  19. public override string SqlTranslationRight
  20. {
  21. get
  22. {
  23. return "\"";
  24. }
  25. }
  26. public override string GetTranslationText(string name)
  27. {
  28. return SqlTranslationLeft + name.ToUpper() + SqlTranslationRight;
  29. }
  30. public override string GetTranslationTableName(string entityName, bool isMapping = true)
  31. {
  32. Check.ArgumentNullException(entityName, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
  33. if (IsTranslationText(entityName)) return entityName;
  34. isMapping = isMapping && this.MappingTables.HasValue();
  35. var isComplex = entityName.Contains(UtilConstants.Dot);
  36. if (isMapping && isComplex)
  37. {
  38. var columnInfo = entityName.Split(UtilConstants.DotChar);
  39. var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(columnInfo.Last(), StringComparison.CurrentCultureIgnoreCase));
  40. if (mappingInfo != null)
  41. {
  42. columnInfo[columnInfo.Length - 1] = mappingInfo.EntityName;
  43. }
  44. return string.Join(UtilConstants.Dot, columnInfo.Select(it => GetTranslationText(it)));
  45. }
  46. else if (isMapping)
  47. {
  48. var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase));
  49. var tableName = mappingInfo?.DbTableName+"";
  50. if (tableName.Contains("."))
  51. {
  52. tableName = string.Join(UtilConstants.Dot, tableName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
  53. return tableName;
  54. }
  55. return SqlTranslationLeft + (mappingInfo == null ? entityName : mappingInfo.DbTableName).ToUpper() + SqlTranslationRight;
  56. }
  57. else if (isComplex)
  58. {
  59. return string.Join(UtilConstants.Dot, entityName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
  60. }
  61. else
  62. {
  63. return GetTranslationText(entityName);
  64. }
  65. }
  66. public override string GetTranslationColumnName(string columnName)
  67. {
  68. Check.ArgumentNullException(columnName, string.Format(ErrorMessage.ObjNotExist, "Column Name"));
  69. if (columnName.Substring(0, 1) == this.SqlParameterKeyWord)
  70. {
  71. return columnName;
  72. }
  73. if (IsTranslationText(columnName)) return columnName;
  74. if (columnName.Contains(UtilConstants.Dot))
  75. {
  76. return string.Join(UtilConstants.Dot, columnName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
  77. }
  78. else
  79. {
  80. return GetTranslationText(columnName);
  81. }
  82. }
  83. public override string GetDbColumnName(string entityName, string propertyName)
  84. {
  85. if (this.MappingColumns.HasValue())
  86. {
  87. var mappingInfo = this.MappingColumns.SingleOrDefault(it => it.EntityName == entityName && it.PropertyName == propertyName);
  88. return (mappingInfo == null ? propertyName : mappingInfo.DbColumnName).ToUpper();
  89. }
  90. else
  91. {
  92. return propertyName.ToUpper();
  93. }
  94. }
  95. }
  96. public class OscarLMethod : DefaultDbMethod, IDbMethods
  97. {
  98. public override string CharIndex(MethodCallExpressionModel model)
  99. {
  100. return string.Format(" (strpos ({1},{0})-1)", model.Args[0].MemberName, model.Args[1].MemberName);
  101. }
  102. public override string IIF(MethodCallExpressionModel model)
  103. {
  104. var parameter = model.Args[0];
  105. var parameter2 = model.Args[1];
  106. var parameter3 = model.Args[2];
  107. if (parameter.Type == UtilConstants.BoolType)
  108. {
  109. parameter.MemberName = parameter.MemberName.ToString().Replace("=1", "=true");
  110. parameter2.MemberName = false;
  111. parameter3.MemberName = true;
  112. }
  113. return string.Format("( CASE WHEN {0} THEN {1} ELSE {2} END )", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  114. }
  115. public override string DateValue(MethodCallExpressionModel model)
  116. {
  117. var parameter = model.Args[0];
  118. var parameter2 = model.Args[1];
  119. if (parameter.MemberName != null && parameter.MemberName is DateTime)
  120. {
  121. return string.Format(" datepart({0},'{1}') ", parameter2.MemberValue, parameter.MemberName);
  122. }
  123. else
  124. {
  125. return string.Format(" datepart({0},{1}) ", parameter2.MemberValue, parameter.MemberName);
  126. }
  127. }
  128. public override string Contains(MethodCallExpressionModel model)
  129. {
  130. var parameter = model.Args[0];
  131. var parameter2 = model.Args[1];
  132. return string.Format(" ({0} like concat('%',{1},'%')) ", parameter.MemberName, parameter2.MemberName );
  133. }
  134. public override string StartsWith(MethodCallExpressionModel model)
  135. {
  136. var parameter = model.Args[0];
  137. var parameter2 = model.Args[1];
  138. return string.Format(" ({0} like concat({1},'%')) ", parameter.MemberName, parameter2.MemberName);
  139. }
  140. public override string EndsWith(MethodCallExpressionModel model)
  141. {
  142. var parameter = model.Args[0];
  143. var parameter2 = model.Args[1];
  144. return string.Format(" ({0} like concat('%',{1}))", parameter.MemberName,parameter2.MemberName);
  145. }
  146. public override string DateIsSameDay(MethodCallExpressionModel model)
  147. {
  148. var parameter = model.Args[0];
  149. var parameter2 = model.Args[1];
  150. return string.Format(" (date_part('day',{0}-{1})=0) ", parameter.MemberName, parameter2.MemberName); ;
  151. }
  152. public override string DateIsSameByType(MethodCallExpressionModel model)
  153. {
  154. var parameter = model.Args[0];
  155. var parameter2 = model.Args[1];
  156. var parameter3 = model.Args[2];
  157. return string.Format(" (date_part('{2}',{0}-{1})=0) ", parameter.MemberName, parameter2.MemberName, parameter3.MemberValue);
  158. }
  159. public override string ToDate(MethodCallExpressionModel model)
  160. {
  161. var parameter = model.Args[0];
  162. return string.Format(" CAST({0} AS timestamp)", parameter.MemberName);
  163. }
  164. public override string ToInt32(MethodCallExpressionModel model)
  165. {
  166. var parameter = model.Args[0];
  167. return string.Format(" CAST({0} AS INT4)", parameter.MemberName);
  168. }
  169. public override string ToInt64(MethodCallExpressionModel model)
  170. {
  171. var parameter = model.Args[0];
  172. return string.Format(" CAST({0} AS INT8)", parameter.MemberName);
  173. }
  174. public override string ToString(MethodCallExpressionModel model)
  175. {
  176. var parameter = model.Args[0];
  177. return string.Format(" CAST({0} AS VARCHAR(1024))", parameter.MemberName);
  178. }
  179. public override string ToGuid(MethodCallExpressionModel model)
  180. {
  181. var parameter = model.Args[0];
  182. return string.Format(" CAST({0} AS VARCHAR)", parameter.MemberName);
  183. }
  184. public override string ToDouble(MethodCallExpressionModel model)
  185. {
  186. var parameter = model.Args[0];
  187. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  188. }
  189. public override string ToBool(MethodCallExpressionModel model)
  190. {
  191. var parameter = model.Args[0];
  192. return string.Format(" CAST({0} AS boolean)", parameter.MemberName);
  193. }
  194. public override string ToDecimal(MethodCallExpressionModel model)
  195. {
  196. var parameter = model.Args[0];
  197. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  198. }
  199. public override string Length(MethodCallExpressionModel model)
  200. {
  201. var parameter = model.Args[0];
  202. return string.Format(" LENGTH({0})", parameter.MemberName);
  203. }
  204. public override string MergeString(params string[] strings)
  205. {
  206. return " concat("+string.Join(",", strings).Replace("+", "") + ") ";
  207. }
  208. public override string IsNull(MethodCallExpressionModel model)
  209. {
  210. var parameter = model.Args[0];
  211. var parameter1 = model.Args[1];
  212. return string.Format("(CASE WHEN {0} IS NULL THEN {1} ELSE {0} END)", parameter.MemberName, parameter1.MemberName);
  213. }
  214. public override string GetDate()
  215. {
  216. return "NOW()";
  217. }
  218. public override string GetRandom()
  219. {
  220. return "RANDOM()";
  221. }
  222. public override string EqualTrue(string fieldName)
  223. {
  224. return "( " + fieldName + "=true )";
  225. }
  226. public override string DateDiff(MethodCallExpressionModel model)
  227. {
  228. var parameter = model.Args[0];
  229. var parameter2 = model.Args[1];
  230. var parameter3 = model.Args[2];
  231. return string.Format(" DATEDIFF('{0}',{1},{2}) ", parameter.MemberValue?.ToString().ToSqlFilter(), parameter2.MemberName, parameter3.MemberName);
  232. }
  233. }
  234. }