MySqlExpressionContext.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. namespace SqlSugar
  6. {
  7. public class MySqlExpressionContext : ExpressionContext, ILambdaExpressions
  8. {
  9. public SqlSugarProvider Context { get; set; }
  10. public MySqlExpressionContext()
  11. {
  12. base.DbMehtods = new MySqlMethod();
  13. }
  14. public override string SqlTranslationLeft { get { return "`"; } }
  15. public override string SqlTranslationRight { get { return "`"; } }
  16. }
  17. public class MySqlMethod : DefaultDbMethod, IDbMethods
  18. {
  19. public override string JsonArrayLength(MethodCallExpressionModel model)
  20. {
  21. var parameter = model.Args[0];
  22. return $" JSON_LENGTH({parameter.MemberName}) ";
  23. }
  24. public override string JsonIndex(MethodCallExpressionModel model)
  25. {
  26. var parameter = model.Args[0];
  27. var parameter1 = model.Args[1];
  28. return $"JSON_UNQUOTE(JSON_EXTRACT({parameter.MemberName}, '$[{parameter1.MemberValue}]'))";
  29. }
  30. public override string WeekOfYear(MethodCallExpressionModel mode)
  31. {
  32. var parameterNameA = mode.Args[0].MemberName;
  33. return $" WEEK({parameterNameA}) ";
  34. }
  35. public override string GetStringJoinSelector(string result, string separator)
  36. {
  37. return $"group_concat({result} separator '{separator}') ";
  38. }
  39. public override string DateDiff(MethodCallExpressionModel model)
  40. {
  41. var parameter = model.Args[0];
  42. var parameter2 = model.Args[1];
  43. var parameter3 = model.Args[2];
  44. return string.Format(" TIMESTAMPDIFF({0},{1},{2}) ", parameter.MemberValue?.ToString().ToSqlFilter(), parameter2.MemberName, parameter3.MemberName);
  45. }
  46. public override string DateValue(MethodCallExpressionModel model)
  47. {
  48. var parameter = model.Args[0];
  49. var parameter2 = model.Args[1];
  50. if (parameter.MemberName != null && parameter.MemberName is DateTime)
  51. {
  52. return string.Format(" {0}('{1}') ", parameter2.MemberValue, parameter.MemberName);
  53. }
  54. else
  55. {
  56. return string.Format(" {0}({1}) ", parameter2.MemberValue, parameter.MemberName);
  57. }
  58. }
  59. public override string Contains(MethodCallExpressionModel model)
  60. {
  61. var parameter = model.Args[0];
  62. var parameter2 = model.Args[1];
  63. return string.Format(" ({0} like concat('%',{1},'%')) ", parameter.MemberName, parameter2.MemberName );
  64. }
  65. public override string StartsWith(MethodCallExpressionModel model)
  66. {
  67. var parameter = model.Args[0];
  68. var parameter2 = model.Args[1];
  69. return string.Format(" ({0} like concat({1},'%')) ", parameter.MemberName, parameter2.MemberName);
  70. }
  71. public override string EndsWith(MethodCallExpressionModel model)
  72. {
  73. var parameter = model.Args[0];
  74. var parameter2 = model.Args[1];
  75. return string.Format(" ({0} like concat('%',{1}))", parameter.MemberName,parameter2.MemberName);
  76. }
  77. public override string DateIsSameDay(MethodCallExpressionModel model)
  78. {
  79. var parameter = model.Args[0];
  80. var parameter2 = model.Args[1];
  81. return string.Format(" (TIMESTAMPDIFF(day,date({0}),date({1}))=0) ", parameter.MemberName, parameter2.MemberName); ;
  82. }
  83. public override string DateIsSameByType(MethodCallExpressionModel model)
  84. {
  85. var parameter = model.Args[0];
  86. var parameter2 = model.Args[1];
  87. var parameter3 = model.Args[2];
  88. if (parameter3.MemberValue.ObjToString() == DateType.Weekday.ObjToString())
  89. {
  90. parameter3.MemberValue = "Week";
  91. }
  92. return string.Format(" (TIMESTAMPDIFF({2},{0},{1})=0) ", parameter.MemberName, parameter2.MemberName, parameter3.MemberValue);
  93. }
  94. public override string DateAddByType(MethodCallExpressionModel model)
  95. {
  96. var parameter = model.Args[0];
  97. var parameter2 = model.Args[1];
  98. var parameter3 = model.Args[2];
  99. if (parameter3.MemberValue.ObjToString() == "Millisecond")
  100. {
  101. parameter3.MemberValue = "Second";
  102. return string.Format(" (DATE_ADD({1} , INTERVAL {2}/1000 {0})) ", parameter3.MemberValue, parameter.MemberName, parameter2.MemberName);
  103. }
  104. return string.Format(" (DATE_ADD({1} , INTERVAL {2} {0})) ", parameter3.MemberValue, parameter.MemberName, parameter2.MemberName);
  105. }
  106. public override string DateAddDay(MethodCallExpressionModel model)
  107. {
  108. var parameter = model.Args[0];
  109. var parameter2 = model.Args[1];
  110. return string.Format(" (DATE_ADD({0}, INTERVAL {1} day)) ", parameter.MemberName, parameter2.MemberName);
  111. }
  112. public override string ToInt32(MethodCallExpressionModel model)
  113. {
  114. var parameter = model.Args[0];
  115. return string.Format(" CAST({0} AS SIGNED)", parameter.MemberName);
  116. }
  117. public override string ToInt64(MethodCallExpressionModel model)
  118. {
  119. var parameter = model.Args[0];
  120. return string.Format(" CAST({0} AS SIGNED)", parameter.MemberName);
  121. }
  122. public override string ToString(MethodCallExpressionModel model)
  123. {
  124. var parameter = model.Args[0];
  125. return string.Format(" CAST({0} AS CHAR)", parameter.MemberName);
  126. }
  127. public override string ToGuid(MethodCallExpressionModel model)
  128. {
  129. var parameter = model.Args[0];
  130. return string.Format(" CAST({0} AS CHAR)", parameter.MemberName);
  131. }
  132. public override string ToDouble(MethodCallExpressionModel model)
  133. {
  134. var parameter = model.Args[0];
  135. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  136. }
  137. public override string ToBool(MethodCallExpressionModel model)
  138. {
  139. var parameter = model.Args[0];
  140. return string.Format(" CAST({0} AS SIGNED)", parameter.MemberName);
  141. }
  142. public override string ToDecimal(MethodCallExpressionModel model)
  143. {
  144. var parameter = model.Args[0];
  145. return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
  146. }
  147. public override string Length(MethodCallExpressionModel model)
  148. {
  149. var parameter = model.Args[0];
  150. return string.Format(" LENGTH({0})", parameter.MemberName);
  151. }
  152. public override string MergeString(params string[] strings)
  153. {
  154. return " concat("+string.Join(",", strings) + ") ";
  155. }
  156. public override string IsNull(MethodCallExpressionModel model)
  157. {
  158. var parameter = model.Args[0];
  159. var parameter1 = model.Args[1];
  160. if (parameter1.MemberValue is bool)
  161. {
  162. return string.Format("IFNULL(CAST({0} as SIGNED),{1})", parameter.MemberName, parameter1.MemberName);
  163. }
  164. else
  165. {
  166. return string.Format("IFNULL({0},{1})", parameter.MemberName, parameter1.MemberName);
  167. }
  168. }
  169. public override string GetDate()
  170. {
  171. return "NOW()";
  172. }
  173. public override string GetRandom()
  174. {
  175. return "rand()";
  176. }
  177. public override string Collate(MethodCallExpressionModel model)
  178. {
  179. var name = model.Args[0].MemberName;
  180. return $" binary {name} ";
  181. }
  182. public override string CharIndex(MethodCallExpressionModel model)
  183. {
  184. return string.Format("instr ({0},{1})", model.Args[0].MemberName, model.Args[1].MemberName);
  185. }
  186. public override string JsonField(MethodCallExpressionModel model)
  187. {
  188. var parameter = model.Args[0];
  189. var parameter1 = model.Args[1];
  190. //var parameter2 = model.Args[2];
  191. //var parameter3= model.Args[3];
  192. var result = GetJson(parameter.MemberName, parameter1.MemberValue, model.Args.Count() == 2);
  193. if (model.Args.Count > 2)
  194. {
  195. result = GetJson(result, model.Args[2].MemberValue, model.Args.Count() == 3);
  196. }
  197. if (model.Args.Count > 3)
  198. {
  199. result = GetJson(result, model.Args[3].MemberValue, model.Args.Count() == 4);
  200. }
  201. if (model.Args.Count > 4)
  202. {
  203. result = GetJson(result, model.Args[4].MemberValue, model.Args.Count() == 5);
  204. }
  205. if (model.Args.Count > 5)
  206. {
  207. result = GetJson(result, model.Args[5].MemberValue, model.Args.Count() == 6);
  208. }
  209. return result;
  210. }
  211. private string GetJson(object memberName1, object memberName2, bool isLast)
  212. {
  213. return $"{memberName1}->\"$.{memberName2}\"";
  214. }
  215. public override string JsonArrayAny(MethodCallExpressionModel model)
  216. {
  217. if (UtilMethods.IsNumber(model.Args[1].MemberValue.GetType().Name))
  218. {
  219. return $" JSON_CONTAINS({model.Args[0].MemberName}, '{model.Args[1].MemberValue}')";
  220. }
  221. else
  222. {
  223. return $" JSON_CONTAINS({model.Args[0].MemberName}, '\"{model.Args[1].MemberValue.ObjToStringNoTrim().ToSqlFilter()}\"')";
  224. }
  225. }
  226. public override string JsonListObjectAny(MethodCallExpressionModel model)
  227. {
  228. if (UtilMethods.IsNumber(model.Args[2].MemberValue.GetType().Name))
  229. {
  230. return $" JSON_CONTAINS({model.Args[0].MemberName},'{{\"{model.Args[1].MemberValue}\":{model.Args[2].MemberValue}}}')";
  231. }
  232. else
  233. {
  234. return $" JSON_CONTAINS({model.Args[0].MemberName},'{{\"{model.Args[1].MemberValue}\":\"{model.Args[2].MemberValue.ObjToStringNoTrim().ToSqlFilter()}\"}}')";
  235. }
  236. }
  237. public override string NewUid(MethodCallExpressionModel mode)
  238. {
  239. return " CONCAT(\r\n LPAD(UPPER(HEX(FLOOR(UUID_SHORT() / 0x100000000))), 8, '0'),\r\n '-',\r\n LPAD(UPPER(HEX(FLOOR(UUID_SHORT() / 0x10000) & 0xFFFF)), 4, '0'),\r\n '-',\r\n LPAD(UPPER(HEX(FLOOR(UUID_SHORT() / 0x100) & 0xFFFF)), 4, '0'),\r\n '-',\r\n LPAD(UPPER(HEX(UUID_SHORT() & 0xFF)), 4, '0'),\r\n '-000000000000'\r\n ) ";
  240. }
  241. //public override string TrimEnd(MethodCallExpressionModel mode)
  242. //{
  243. // var parameterNameA = mode.Args[0].MemberName;
  244. // var parameterNameB = mode.Args[1].MemberName;
  245. // return $" TRIM(TRAILING {parameterNameA} FROM {parameterNameB}) ";
  246. //}
  247. //public override string TrimStart(MethodCallExpressionModel mode)
  248. //{
  249. // var parameterNameA = mode.Args[0].MemberName;
  250. // var parameterNameB = mode.Args[1].MemberName;
  251. // return $" TRIM(LEADING {parameterNameA} FROM {parameterNameB}) ";
  252. //}
  253. public override string FullTextContains(MethodCallExpressionModel mode)
  254. {
  255. var columns = mode.Args[0].MemberName;
  256. if (mode.Args[0].MemberValue is List<string>)
  257. {
  258. columns = string.Join(",", mode.Args[0].MemberValue as List<string>) ;
  259. }
  260. var searchWord = mode.Args[1].MemberName;
  261. return $" MATCH({columns}) AGAINST({searchWord}) ";
  262. }
  263. }
  264. }