OracleExpressionContext.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.Globalization;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Reflection;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace SqlSugar
  12. {
  13. public partial class OracleExpressionContext : ExpressionContext, ILambdaExpressions
  14. {
  15. public SqlSugarProvider Context { get; set; }
  16. public OracleExpressionContext()
  17. {
  18. base.DbMehtods = new OracleMethod();
  19. }
  20. public override string SqlParameterKeyWord
  21. {
  22. get
  23. {
  24. return ":";
  25. }
  26. }
  27. public override string SqlTranslationLeft { get { return "\""; } }
  28. public override string SqlTranslationRight { get { return "\""; } }
  29. public override string GetTranslationTableName(string entityName, bool isMapping = true)
  30. {
  31. return base.GetTranslationTableName(entityName, isMapping).ToUpper(IsUppper);
  32. }
  33. public override string GetTranslationColumnName(string columnName)
  34. {
  35. if (columnName == "systimestamp")
  36. {
  37. return columnName;
  38. }
  39. if (columnName.Contains(":"))
  40. return base.GetTranslationColumnName(columnName);
  41. else if (columnName.Contains("\".\""))
  42. {
  43. return columnName;
  44. }
  45. else
  46. return base.GetTranslationColumnName(columnName).ToUpper(IsUppper);
  47. }
  48. public override string GetDbColumnName(string entityName, string propertyName)
  49. {
  50. return base.GetDbColumnName(entityName,propertyName).ToUpper(IsUppper);
  51. }
  52. public override bool IsTranslationText(string name)
  53. {
  54. if (!string.IsNullOrEmpty(name) && name.ToLower() == "sysdate")
  55. {
  56. return true;
  57. }
  58. var result = name.IsContainsIn(SqlTranslationLeft, SqlTranslationRight, UtilConstants.Space, ExpressionConst.LeftParenthesis, ExpressionConst.RightParenthesis);
  59. return result;
  60. }
  61. public bool IsUppper
  62. {
  63. get
  64. {
  65. if (this.SugarContext?.Context?.Context?.CurrentConnectionConfig?.MoreSettings == null)
  66. {
  67. return true;
  68. }
  69. else
  70. {
  71. return this.SugarContext?.Context?.Context?.CurrentConnectionConfig?.MoreSettings.IsAutoToUpper == true;
  72. }
  73. }
  74. }
  75. }
  76. public partial class OracleMethod : DefaultDbMethod, IDbMethods
  77. {
  78. public override string IsNullOrEmpty(MethodCallExpressionModel model)
  79. {
  80. var parameter = model.Args[0];
  81. return string.Format("( {0} IS NULL )", parameter.MemberName);
  82. }
  83. public override string WeekOfYear(MethodCallExpressionModel mode)
  84. {
  85. var parameterNameA = mode.Args[0].MemberName;
  86. return $"TO_NUMBER(TO_CHAR({parameterNameA}, 'WW')) ";
  87. }
  88. public override string BitwiseAnd(MethodCallExpressionModel model)
  89. {
  90. var parameter = model.Args[0];
  91. var parameter2 = model.Args[1];
  92. return string.Format(" BITAND({0},{1}) ", parameter.MemberName, parameter2.MemberName);
  93. }
  94. public override string BitwiseInclusiveOR(MethodCallExpressionModel model)
  95. {
  96. var parameter = model.Args[0];
  97. var parameter2 = model.Args[1];
  98. return string.Format(" BITOR({0},{1}) ", parameter.MemberName, parameter2.MemberName);
  99. }
  100. public override string ParameterKeyWord { get; set; } = ":";
  101. public override string Modulo(MethodCallExpressionModel model)
  102. {
  103. return " MOD(" + model.Args[0].MemberName+ " , " + model.Args[1].MemberName+")";
  104. }
  105. public override string GetStringJoinSelector(string result, string separator)
  106. {
  107. return $"listagg(to_char({result}),'{separator}') within group(order by {result}) ";
  108. }
  109. public override string HasValue(MethodCallExpressionModel model)
  110. {
  111. var parameter = model.Args[0];
  112. return string.Format("( {0} IS NOT NULL ) ", parameter.MemberName);
  113. }
  114. public override string DateDiff(MethodCallExpressionModel model)
  115. {
  116. var parameter = (DateType)(Enum.Parse(typeof(DateType), model.Args[0].MemberValue.ObjToString()));
  117. var begin = model.Args[1].MemberName;
  118. var end = model.Args[2].MemberName;
  119. switch (parameter)
  120. {
  121. case DateType.Year:
  122. return $" ( cast((months_between( {end} , {begin}))/12 as number(9,0) ) )";
  123. case DateType.Month:
  124. return $" ( cast((months_between( {end} , {begin})) as number(9,0) ) )";
  125. case DateType.Day:
  126. return $" ( ROUND(TO_NUMBER(cast({end} as date) - cast({begin} as date))) )";
  127. case DateType.Hour:
  128. return $" ( ROUND(TO_NUMBER(cast({end} as date) - cast({begin} as date)) * 24) )";
  129. case DateType.Minute:
  130. return $" ( ROUND(TO_NUMBER(cast({end} as date) - cast({begin} as date)) * 24 * 60) )";
  131. case DateType.Second:
  132. return $" ( ROUND(TO_NUMBER(cast({end} as date) - cast({begin} as date)) * 24 * 60 * 60) )";
  133. case DateType.Millisecond:
  134. return $" ( ROUND(TO_NUMBER(cast({end} as date) - cast({begin} as date)) * 24 * 60 * 60 * 60) )";
  135. default:
  136. break;
  137. }
  138. throw new Exception(parameter + " datediff no support");
  139. }
  140. private void PageEach<T>(IEnumerable<T> pageItems, int pageSize, Action<List<T>> action)
  141. {
  142. if (pageItems != null && pageItems.Any())
  143. {
  144. int totalRecord = pageItems.Count();
  145. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  146. for (int i = 1; i <= pageCount; i++)
  147. {
  148. var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList();
  149. action(list);
  150. }
  151. }
  152. }
  153. public override string ContainsArray(MethodCallExpressionModel model)
  154. {
  155. if (model.Args[0].MemberValue == null)
  156. {
  157. return base.ContainsArray(model);
  158. }
  159. var inValueIEnumerable = ((IEnumerable)model.Args[0].MemberValue).Cast<object>().ToArray();
  160. if (inValueIEnumerable.Count() < 1000)
  161. {
  162. return base.ContainsArray(model);
  163. }
  164. else
  165. {
  166. string result = "";
  167. PageEach(inValueIEnumerable, 999, it =>
  168. {
  169. model.Args.First().MemberValue = it;
  170. result+= (base.ContainsArray(model) + " OR ");
  171. });
  172. return " ( "+result.TrimEnd(' ').TrimEnd('R').TrimEnd('O')+" ) ";
  173. }
  174. }
  175. public override string ToInt64(MethodCallExpressionModel model)
  176. {
  177. var parameter = model.Args[0];
  178. return string.Format(" CAST({0} AS Number)", parameter.MemberName);
  179. }
  180. public override string ToTime(MethodCallExpressionModel model)
  181. {
  182. var parameter = model.Args[0];
  183. return string.Format(" to_timestamp({0},'0000-01-01 hh24:mi:ss') ", parameter.MemberName);
  184. }
  185. public override string Substring(MethodCallExpressionModel model)
  186. {
  187. var parameter = model.Args[0];
  188. var parameter2 = model.Args[1];
  189. var parameter3 = model.Args[2];
  190. return string.Format("SUBSTR({0},1 + {1},{2})", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  191. }
  192. public override string DateValue(MethodCallExpressionModel model)
  193. {
  194. var parameter = model.Args[0];
  195. var parameter2 = model.Args[1];
  196. var type = (DateType)Enum.Parse(typeof(DateType), parameter2.MemberValue.ObjToString(), false);
  197. switch (type)
  198. {
  199. case DateType.Year:
  200. return string.Format("(CAST(TO_CHAR({0},'yyyy') AS NUMBER))", parameter.MemberName);
  201. case DateType.Month:
  202. return string.Format("(CAST(TO_CHAR({0},'mm') AS NUMBER))", parameter.MemberName);
  203. case DateType.Hour:
  204. return string.Format("(CAST(TO_CHAR({0},'hh24') AS NUMBER))", parameter.MemberName);
  205. case DateType.Second:
  206. return string.Format("(CAST(TO_CHAR({0},'ss') AS NUMBER))", parameter.MemberName);
  207. case DateType.Minute:
  208. return string.Format("(CAST(TO_CHAR({0},'mi') AS NUMBER))", parameter.MemberName);
  209. case DateType.Millisecond:
  210. return string.Format("(CAST(TO_CHAR({0},'ff3') AS NUMBER))", parameter.MemberName);
  211. case DateType.Weekday:
  212. return $" to_char({parameter.MemberName},'day') ";
  213. case DateType.Day:
  214. default:
  215. return string.Format("(CAST(TO_CHAR({0},'dd') AS NUMBER))", parameter.MemberName);
  216. }
  217. }
  218. public override string DateAddByType(MethodCallExpressionModel model)
  219. {
  220. var parameter = model.Args[0];
  221. var parameter2 = model.Args[1];
  222. var parameter3 = model.Args[2];
  223. var type = (DateType)Enum.Parse(typeof(DateType), parameter3.MemberValue.ObjToString(), false);
  224. double time = 1;
  225. switch (type)
  226. {
  227. case DateType.Year:
  228. time = 1 * 365;
  229. break;
  230. case DateType.Month:
  231. time = 1 *30;
  232. break;
  233. case DateType.Day:
  234. break;
  235. case DateType.Hour:
  236. time = 1 / 24.0;
  237. break;
  238. case DateType.Second:
  239. time = 1 / 24.0/60.0/60.0;
  240. break;
  241. case DateType.Minute:
  242. time = 1 / 24.0/60.0;
  243. break;
  244. case DateType.Millisecond:
  245. time = 1 / 24.0 / 60.0 / 60.0/1000;
  246. break;
  247. }
  248. return string.Format("({0}+({1}*{2})) ", parameter.MemberName, time,parameter2.MemberName);
  249. }
  250. public override string DateAddDay(MethodCallExpressionModel model)
  251. {
  252. var parameter = model.Args[0];
  253. var parameter2 = model.Args[1];
  254. return string.Format("({0}+(1*{1})) ", parameter.MemberName, parameter2.MemberName);
  255. }
  256. public override string ToString(MethodCallExpressionModel model)
  257. {
  258. var parameter = model.Args[0];
  259. return string.Format(" CAST({0} AS VARCHAR2(4000))", parameter.MemberName);
  260. }
  261. public override string ToDecimal(MethodCallExpressionModel model)
  262. {
  263. var parameter = model.Args[0];
  264. return string.Format(" CAST({0} AS Number)", parameter.MemberName);
  265. }
  266. public override string ToDate(MethodCallExpressionModel model)
  267. {
  268. var parameter = model.Args[0];
  269. return string.Format(" TO_TIMESTAMP({0}, 'YYYY-MM-DD HH24:MI:SS.FF') ", parameter.MemberName);
  270. }
  271. public override string ToDateShort(MethodCallExpressionModel model)
  272. {
  273. var parameter = model.Args[0];
  274. return string.Format(" TRUNC({0},'dd') ", parameter.MemberName);
  275. }
  276. public override string Contains(MethodCallExpressionModel model)
  277. {
  278. var parameter = model.Args[0];
  279. var parameter2 = model.Args[1];
  280. return string.Format(" ({0} like '%'||{1}||'%') ", parameter.MemberName, parameter2.MemberName);
  281. }
  282. public override string StartsWith(MethodCallExpressionModel model)
  283. {
  284. var parameter = model.Args[0];
  285. var parameter2 = model.Args[1];
  286. return string.Format(" ({0} like {1}||'%') ", parameter.MemberName, parameter2.MemberName);
  287. }
  288. public override string EndsWith(MethodCallExpressionModel model)
  289. {
  290. var parameter = model.Args[0];
  291. var parameter2 = model.Args[1];
  292. return string.Format(" ({0} like '%'||{1}) ", parameter.MemberName, parameter2.MemberName);
  293. }
  294. public override string Trim(MethodCallExpressionModel model)
  295. {
  296. var parameter = model.Args[0];
  297. return string.Format(" trim({0}) ", parameter.MemberName);
  298. }
  299. public override string DateIsSameDay(MethodCallExpressionModel model)
  300. {
  301. var parameter = model.Args[0];
  302. var parameter2 = model.Args[1];
  303. return string.Format(" ( cast({0} as date)= cast( {1} as date) ) ", parameter.MemberName, parameter2.MemberName); ;
  304. }
  305. public override string DateIsSameByType(MethodCallExpressionModel model)
  306. {
  307. throw new NotSupportedException("Oracle NotSupportedException DateIsSameDay");
  308. }
  309. public override string Length(MethodCallExpressionModel model)
  310. {
  311. var parameter = model.Args[0];
  312. return string.Format(" LENGTH({0}) ", parameter.MemberName);
  313. }
  314. public override string IsNull(MethodCallExpressionModel model)
  315. {
  316. var parameter = model.Args[0];
  317. var parameter1 = model.Args[1];
  318. return string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName);
  319. }
  320. public override string MergeString(params string[] strings)
  321. {
  322. return string.Join("||", strings);
  323. }
  324. public override string GetDate()
  325. {
  326. return "systimestamp";
  327. }
  328. public override string GetRandom()
  329. {
  330. return "dbms_random.value";
  331. }
  332. public override string Collate(MethodCallExpressionModel model)
  333. {
  334. var name = model.Args[0].MemberName;
  335. return $" NLSSORT({0}, 'NLS_SORT = Latin_CI') ";
  336. }
  337. public override string JsonField(MethodCallExpressionModel model)
  338. {
  339. return $"JSON_VALUE({model.Args[0].MemberName}, '$.{model.Args[1].MemberValue.ToString().ToSqlFilter()}')";
  340. //"JSON_VALUE(j.kingorder, '$.Id') = '1'";
  341. }
  342. public override string CharIndex(MethodCallExpressionModel model)
  343. {
  344. return string.Format("instr ({0},{1},1,1) ", model.Args[0].MemberName, model.Args[1].MemberName);
  345. }
  346. public override string TrimEnd(MethodCallExpressionModel mode)
  347. {
  348. var parameterNameA = mode.Args[0].MemberName;
  349. var parameterNameB = mode.Args[1].MemberName;
  350. return $" RTRIM({parameterNameA}, {parameterNameB}) ";
  351. }
  352. public override string TrimStart(MethodCallExpressionModel mode)
  353. {
  354. var parameterNameA = mode.Args[0].MemberName;
  355. var parameterNameB = mode.Args[1].MemberName;
  356. return $" LTRIM({parameterNameA}, {parameterNameB}) ";
  357. }
  358. public override string Left(MethodCallExpressionModel mode)
  359. {
  360. var parameterNameA = mode.Args[0].MemberName;
  361. var parameterNameB = mode.Args[1].MemberName;
  362. return $" SUBSTR({parameterNameA}, 1, {parameterNameB}) ";
  363. }
  364. public override string Right(MethodCallExpressionModel mode)
  365. {
  366. var parameterNameA = mode.Args[0].MemberName;
  367. var parameterNameB = mode.Args[1].MemberName;
  368. return $" SUBSTR({parameterNameA}, -2, {parameterNameB}) ";
  369. }
  370. public override string Ceil(MethodCallExpressionModel mode)
  371. {
  372. var parameterNameA = mode.Args[0].MemberName;
  373. return $" CEIL({parameterNameA}) ";
  374. }
  375. public override string NewUid(MethodCallExpressionModel mode)
  376. {
  377. return " SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 1, 8) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 9, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 13, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 17, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 21) ";
  378. }
  379. public override string FullTextContains(MethodCallExpressionModel mode)
  380. {
  381. var columns = mode.Args[0].MemberName;
  382. if (mode.Args[0].MemberValue is List<string>)
  383. {
  384. columns = "(" + string.Join(",", mode.Args[0].MemberValue as List<string>) + ")";
  385. }
  386. var searchWord = mode.Args[1].MemberName;
  387. return $" CONTAINS({columns}, {searchWord}, 1) ";
  388. }
  389. }
  390. }