DefaultDbMethod.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. public partial class DefaultDbMethod : IDbMethods
  11. {
  12. public virtual string ParameterKeyWord { get; set; }= "@";
  13. public virtual string RowNumber(MethodCallExpressionModel model)
  14. {
  15. if (model.Args.Count == 1)
  16. {
  17. return $"row_number() over(order by {model.Args[0].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  18. }
  19. else
  20. {
  21. return $"row_number() over( partition by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[0].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  22. }
  23. }
  24. public virtual string RowCount(MethodCallExpressionModel model)
  25. {
  26. if (model.Args.Count > 1)
  27. {
  28. return $"COUNT({model.Args[0].MemberName}) over( partition by {model.Args[2].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  29. }
  30. return "COUNT(1) over()";
  31. }
  32. public string RowSum(MethodCallExpressionModel model)
  33. {
  34. if (model.Args.Count > 1)
  35. {
  36. return $"SUM({model.Args[0].MemberName}) over( partition by {model.Args[2].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  37. }
  38. return "SUM(" + model.Args[0].MemberName +") over()";
  39. }
  40. public string RowAvg(MethodCallExpressionModel model)
  41. {
  42. if (model.Args.Count > 1)
  43. {
  44. return $"AVG({model.Args[0].MemberName}) over( partition by {model.Args[2].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  45. }
  46. return "AVG(" + model.Args[0].MemberName + ") over()";
  47. }
  48. public string RowMin(MethodCallExpressionModel model)
  49. {
  50. if (model.Args.Count > 1)
  51. {
  52. return $"Min({model.Args[0].MemberName}) over( partition by {model.Args[2].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  53. }
  54. return "Min(" + model.Args[0].MemberName + ") over()";
  55. }
  56. public string RowMax(MethodCallExpressionModel model)
  57. {
  58. if (model.Args.Count > 1)
  59. {
  60. return $"Max({model.Args[0].MemberName}) over( partition by {model.Args[2].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')} order by {model.Args[1].MemberName.ObjToString().TrimEnd('\'').TrimStart('\'')})";
  61. }
  62. return "Max(" + model.Args[0].MemberName + ") over()";
  63. }
  64. public virtual string IIF(MethodCallExpressionModel model)
  65. {
  66. var parameter = model.Args[0];
  67. var parameter2 = model.Args[1];
  68. var parameter3 = model.Args[2];
  69. return string.Format("( CASE WHEN {0} THEN {1} ELSE {2} END )", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  70. }
  71. public virtual string IsNullOrEmpty(MethodCallExpressionModel model)
  72. {
  73. var parameter = model.Args[0];
  74. return string.Format("( {0} IS NULL OR {0}='')", parameter.MemberName);
  75. }
  76. public virtual string HasValue(MethodCallExpressionModel model)
  77. {
  78. var parameter = model.Args[0];
  79. return string.Format("({0} IS NOT NULL )", parameter.MemberName);
  80. }
  81. public virtual string HasNumber(MethodCallExpressionModel model)
  82. {
  83. var parameter = model.Args[0];
  84. return string.Format("( {0}>0 AND {0} IS NOT NULL )", parameter.MemberName);
  85. }
  86. public virtual string ToUpper(MethodCallExpressionModel model)
  87. {
  88. var parameter = model.Args[0];
  89. return string.Format(" (UPPER({0})) ", parameter.MemberName);
  90. }
  91. public virtual string ToLower(MethodCallExpressionModel model)
  92. {
  93. var parameter = model.Args[0];
  94. return string.Format(" (LOWER({0})) ", parameter.MemberName);
  95. }
  96. public virtual string Trim(MethodCallExpressionModel model)
  97. {
  98. var parameter = model.Args[0];
  99. return string.Format(" (rtrim(ltrim({0}))) ", parameter.MemberName);
  100. }
  101. public virtual string Contains(MethodCallExpressionModel model)
  102. {
  103. var parameter = model.Args[0];
  104. var parameter2 = model.Args[1];
  105. return string.Format(" ({0} like '%'+{1}+'%') ", parameter.MemberName, parameter2.MemberName);
  106. }
  107. public virtual string ContainsArray(MethodCallExpressionModel model)
  108. {
  109. var inValueIEnumerable = (IEnumerable)model.Args[0].MemberValue;
  110. List<object> inValues = new List<object>();
  111. if (inValueIEnumerable != null)
  112. {
  113. foreach (var item in inValueIEnumerable)
  114. {
  115. if (item != null && item.GetType().IsEnum())
  116. {
  117. inValues.Add(Convert.ToInt64(item));
  118. }
  119. else if (item != null && item.GetType() == UtilConstants.DateType)
  120. {
  121. var inStr = Convert.ToDateTime(item).ToString("yyyy-MM-dd HH:mm:ss.fff");
  122. inValues.Add(inStr);
  123. }
  124. else if (item != null && item.GetType()==UtilConstants.ByteArrayType)
  125. {
  126. var inStr= BitConverter.ToString((byte[])item).Replace("-", "");
  127. inValues.Add(inStr);
  128. }
  129. else
  130. {
  131. inValues.Add(item);
  132. }
  133. }
  134. }
  135. var value = model.Args[1].MemberName;
  136. string inValueString = null;
  137. var isNvarchar = model.Args.Count == 3;
  138. if (inValues != null && inValues.Count > 0)
  139. {
  140. if (isNvarchar&& model.Args[2].MemberValue.Equals(true))
  141. {
  142. inValueString = inValues.ToArray().ToJoinSqlInValsN();
  143. }
  144. else
  145. {
  146. inValueString = inValues.ToArray().ToJoinSqlInVals();
  147. }
  148. }
  149. if (inValueString.IsNullOrEmpty())
  150. {
  151. return " (1=2) ";
  152. }
  153. else
  154. {
  155. return string.Format(" ({0} IN ({1})) ", value, inValueString);
  156. }
  157. }
  158. public virtual string ContainsArrayUseSqlParameters(MethodCallExpressionModel model)
  159. {
  160. var inValueIEnumerable = (IEnumerable)model.Args[0].MemberValue;
  161. List<object> inValues = new List<object>();
  162. if (inValueIEnumerable != null)
  163. {
  164. foreach (var item in inValueIEnumerable)
  165. {
  166. if (item != null && item.GetType().IsEnum())
  167. {
  168. inValues.Add(Convert.ToInt64(item));
  169. }
  170. else
  171. {
  172. inValues.Add(item);
  173. }
  174. }
  175. }
  176. var value = model.Args[1].MemberName;
  177. string inValueString = null;
  178. if (inValues != null && inValues.Count > 0)
  179. {
  180. for (int i = 0; i < inValues.Count; i++)
  181. {
  182. inValueString += model.Data + "_" + i+",";
  183. }
  184. }
  185. if (inValueString.IsNullOrEmpty())
  186. {
  187. return " (1=2) ";
  188. }
  189. else
  190. {
  191. inValueString=inValueString.TrimEnd(',');
  192. return string.Format(" ({0} IN ({1})) ", value, inValueString);
  193. }
  194. }
  195. public virtual string Equals(MethodCallExpressionModel model)
  196. {
  197. var parameter = model.Args[0];
  198. var parameter2 = model.Args[1];
  199. return string.Format(" ({0} = {1}) ", parameter.MemberName, parameter2.MemberName); ;
  200. }
  201. public virtual string EqualsNull(MethodCallExpressionModel model)
  202. {
  203. var parameter = model.Args[0];
  204. var parameter2 = model.Args[1];
  205. if (parameter2.MemberValue == null)
  206. {
  207. return string.Format(" ({0} is null) ", parameter.MemberName, parameter2.MemberName) ;
  208. }
  209. else
  210. {
  211. return string.Format(" ({0} = {1}) ", parameter.MemberName, parameter2.MemberName);
  212. }
  213. }
  214. public virtual string DateIsSameDay(MethodCallExpressionModel model)
  215. {
  216. var parameter = model.Args[0];
  217. var parameter2 = model.Args[1];
  218. return string.Format(" (DATEDIFF(day,{0},{1})=0) ", parameter.MemberName, parameter2.MemberName); ;
  219. }
  220. public virtual string DateIsSameByType(MethodCallExpressionModel model)
  221. {
  222. var parameter = model.Args[0];
  223. var parameter2 = model.Args[1];
  224. var parameter3 = model.Args[2];
  225. return string.Format(" (DATEDIFF({2},{0},{1})=0) ", parameter.MemberName, parameter2.MemberName, parameter3.MemberValue);
  226. }
  227. public virtual string DateAddByType(MethodCallExpressionModel model)
  228. {
  229. var parameter = model.Args[0];
  230. var parameter2 = model.Args[1];
  231. var parameter3 = model.Args[2];
  232. return string.Format(" (DATEADD({2},{1},{0})) ", parameter.MemberName, parameter2.MemberName, parameter3.MemberValue);
  233. }
  234. public virtual string DateAddDay(MethodCallExpressionModel model)
  235. {
  236. var parameter = model.Args[0];
  237. var parameter2 = model.Args[1];
  238. return string.Format(" (DATEADD(day,{1},{0})) ", parameter.MemberName, parameter2.MemberName);
  239. }
  240. public virtual string Between(MethodCallExpressionModel model)
  241. {
  242. var parameter = model.Args[0];
  243. var parameter1 = model.Args[1];
  244. var parameter2 = model.Args[2];
  245. return string.Format(" ({0} BETWEEN {1} AND {2}) ", parameter.MemberName, parameter1.MemberName, parameter2.MemberName);
  246. }
  247. public virtual string StartsWith(MethodCallExpressionModel model)
  248. {
  249. var parameter = model.Args[0];
  250. var parameter2 = model.Args[1];
  251. return string.Format(" ({0} like {1}+'%') ", parameter.MemberName, parameter2.MemberName);
  252. }
  253. public virtual string EndsWith(MethodCallExpressionModel model)
  254. {
  255. var parameter = model.Args[0];
  256. var parameter2 = model.Args[1];
  257. return string.Format(" ({0} like '%'+{1}) ", parameter.MemberName, parameter2.MemberName);
  258. }
  259. public virtual string DateValue(MethodCallExpressionModel model)
  260. {
  261. var parameter = model.Args[0];
  262. var parameter2 = model.Args[1];
  263. if (parameter.MemberName != null && parameter.MemberName is DateTime)
  264. {
  265. return string.Format(" DateName({0},'{1}') ", parameter2.MemberValue, parameter.MemberName);
  266. }
  267. else
  268. {
  269. return string.Format(" DateName({0},{1}) ", parameter2.MemberValue, parameter.MemberName);
  270. }
  271. }
  272. public virtual string GetStringJoinSelector(string result, string separator)
  273. {
  274. return $"string_agg(({result})::text,'{separator}') ";
  275. }
  276. public virtual string ToInt32(MethodCallExpressionModel model)
  277. {
  278. var parameter = model.Args[0];
  279. return string.Format(" CAST({0} AS INT)", parameter.MemberName);
  280. }
  281. public virtual string ToInt64(MethodCallExpressionModel model)
  282. {
  283. var parameter = model.Args[0];
  284. return string.Format(" CAST({0} AS BIGINT)", parameter.MemberName);
  285. }
  286. public virtual string ToString(MethodCallExpressionModel model)
  287. {
  288. var parameter = model.Args[0];
  289. return string.Format(" CAST({0} AS NVARCHAR(MAX))", parameter.MemberName);
  290. }
  291. public virtual string ToGuid(MethodCallExpressionModel model)
  292. {
  293. var parameter = model.Args[0];
  294. return string.Format(" CAST({0} AS UNIQUEIDENTIFIER)", parameter.MemberName);
  295. }
  296. public virtual string ToDouble(MethodCallExpressionModel model)
  297. {
  298. var parameter = model.Args[0];
  299. return string.Format(" CAST({0} AS FLOAT)", parameter.MemberName);
  300. }
  301. public virtual string ToBool(MethodCallExpressionModel model)
  302. {
  303. var parameter = model.Args[0];
  304. return string.Format(" CAST({0} AS BIT)", parameter.MemberName);
  305. }
  306. public virtual string ToDate(MethodCallExpressionModel model)
  307. {
  308. var parameter = model.Args[0];
  309. return string.Format(" CAST({0} AS DATETIME)", parameter.MemberName);
  310. }
  311. public virtual string ToDateShort(MethodCallExpressionModel model)
  312. {
  313. var parameter = model.Args[0];
  314. return string.Format(" CAST({0} AS DATE)", parameter.MemberName);
  315. }
  316. public virtual string ToTime(MethodCallExpressionModel model)
  317. {
  318. var parameter = model.Args[0];
  319. return string.Format(" CAST({0} AS TIME)", parameter.MemberName);
  320. }
  321. public virtual string ToDecimal(MethodCallExpressionModel model)
  322. {
  323. var parameter = model.Args[0];
  324. return string.Format(" CAST({0} AS MONEY)", parameter.MemberName);
  325. }
  326. public virtual string Substring(MethodCallExpressionModel model)
  327. {
  328. var parameter = model.Args[0];
  329. var parameter2 = model.Args[1];
  330. var parameter3 = model.Args[2];
  331. return string.Format("SUBSTRING({0},1 + {1},{2})", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  332. }
  333. public virtual string Length(MethodCallExpressionModel model)
  334. {
  335. var parameter = model.Args[0];
  336. return string.Format("LEN({0})", parameter.MemberName);
  337. }
  338. public virtual string Replace(MethodCallExpressionModel model)
  339. {
  340. var parameter = model.Args[0];
  341. var parameter2 = model.Args[1];
  342. var parameter3 = model.Args[2];
  343. return string.Format("REPLACE({0},{1},{2})", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
  344. }
  345. public virtual string AggregateSum(MethodCallExpressionModel model)
  346. {
  347. var parameter = model.Args[0];
  348. return string.Format("SUM({0})", parameter.MemberName);
  349. }
  350. public virtual string AggregateAvg(MethodCallExpressionModel model)
  351. {
  352. var parameter = model.Args[0];
  353. return string.Format("AVG({0})", parameter.MemberName);
  354. }
  355. public virtual string AggregateMin(MethodCallExpressionModel model)
  356. {
  357. var parameter = model.Args[0];
  358. return string.Format("MIN({0})", parameter.MemberName);
  359. }
  360. public virtual string AggregateMax(MethodCallExpressionModel model)
  361. {
  362. var parameter = model.Args[0];
  363. return string.Format("MAX({0})", parameter.MemberName);
  364. }
  365. public virtual string AggregateCount(MethodCallExpressionModel model)
  366. {
  367. var parameter = model.Args[0];
  368. return string.Format("COUNT({0})", parameter.MemberName);
  369. }
  370. public virtual string AggregateDistinctCount(MethodCallExpressionModel model)
  371. {
  372. var parameter = model.Args[0];
  373. return string.Format("COUNT(DISTINCT {0} )", parameter.MemberName);
  374. }
  375. public virtual string MappingColumn(MethodCallExpressionModel model)
  376. {
  377. if (model.Args.Count == 1)
  378. {
  379. return string.Format("{0}", model.Args[0].MemberValue);
  380. }
  381. else
  382. {
  383. var parameter = model.Args[0];
  384. var parameter1 = model.Args[1];
  385. return string.Format("{0}", parameter1.MemberValue);
  386. }
  387. }
  388. public virtual string IsNull(MethodCallExpressionModel model)
  389. {
  390. var parameter = model.Args[0];
  391. var parameter1 = model.Args[1];
  392. return string.Format("ISNULL({0},{1})", parameter.MemberName, parameter1.MemberName);
  393. }
  394. public virtual string True()
  395. {
  396. return "( 1 = 1 ) ";
  397. }
  398. public virtual string False()
  399. {
  400. return "( 1 = 2 ) ";
  401. }
  402. public virtual string TrueValue()
  403. {
  404. return "1 ";
  405. }
  406. public virtual string FalseValue()
  407. {
  408. return "0";
  409. }
  410. public string GuidNew()
  411. {
  412. return "'" + Guid.NewGuid() + "' ";
  413. }
  414. public string GetSelfAndAutoFill(string shortName, bool isSingle)
  415. {
  416. if (isSingle) return "*";
  417. else
  418. return string.Format("{0}.*", shortName);
  419. }
  420. public virtual string MergeString(params string[] strings)
  421. {
  422. return string.Join("+", strings);
  423. }
  424. public virtual string Pack(string sql)
  425. {
  426. return "(" + sql + ")";
  427. }
  428. public virtual string EqualTrue(string fieldName)
  429. {
  430. return "( " + fieldName + "=1 )";
  431. }
  432. public virtual string Null()
  433. {
  434. return "NULL";
  435. }
  436. public virtual string GetDate()
  437. {
  438. return "GETDATE()";
  439. }
  440. public virtual string GetRandom()
  441. {
  442. return "NEWID()";
  443. }
  444. public virtual string CaseWhen(List<KeyValuePair<string, string>> sqls)
  445. {
  446. StringBuilder reslut = new StringBuilder();
  447. foreach (var item in sqls)
  448. {
  449. if (item.Key == "IF")
  450. {
  451. reslut.AppendFormat(" ( CASE WHEN {0} ", item.Value);
  452. }
  453. else if (item.Key == "End")
  454. {
  455. reslut.AppendFormat("ELSE {0} END )", item.Value);
  456. }
  457. else if (item.Key == "Return")
  458. {
  459. reslut.AppendFormat(" THEN {0} ", item.Value);
  460. }
  461. else {
  462. reslut.AppendFormat(" WHEN {0} ", item.Value);
  463. }
  464. }
  465. return reslut.ToString();
  466. }
  467. public virtual string CharIndex(MethodCallExpressionModel model)
  468. {
  469. return string.Format("CHARINDEX ({0},{1})", model.Args[0].MemberName, model.Args[1].MemberName);
  470. }
  471. public virtual string CharIndexNew(MethodCallExpressionModel model)
  472. {
  473. return CharIndex(model);
  474. }
  475. public virtual string ToVarchar(MethodCallExpressionModel model)
  476. {
  477. var parameter = model.Args[0];
  478. return string.Format(" CAST({0} AS VARCHAR(MAX))", parameter.MemberName);
  479. }
  480. public virtual string BitwiseAnd(MethodCallExpressionModel model)
  481. {
  482. var parameter = model.Args[0];
  483. var parameter2 = model.Args[1];
  484. return string.Format(" ({0} & {1}) ", parameter.MemberName, parameter2.MemberName); ;
  485. }
  486. public virtual string BitwiseInclusiveOR(MethodCallExpressionModel model)
  487. {
  488. var parameter = model.Args[0];
  489. var parameter2 = model.Args[1];
  490. return string.Format(" ({0} | {1}) ", parameter.MemberName, parameter2.MemberName); ;
  491. }
  492. public string Oracle_ToDate(MethodCallExpressionModel model)
  493. {
  494. var parameter = model.Args[0];
  495. var parameter2 = model.Args[1];
  496. return string.Format(" to_date({0},{1}) ", parameter.MemberName, parameter2.MemberName); ;
  497. }
  498. public string Oracle_ToChar(MethodCallExpressionModel model)
  499. {
  500. var parameter = model.Args[0];
  501. var parameter2 = model.Args[1];
  502. return string.Format("to_char({0},{1}) ", parameter.MemberName, parameter2.MemberName); ;
  503. }
  504. public string SqlServer_DateDiff(MethodCallExpressionModel model)
  505. {
  506. var parameter = model.Args[0];
  507. var parameter2 = model.Args[1];
  508. var parameter3 = model.Args[2];
  509. return string.Format(" DATEDIFF({0},{1},{2}) ", parameter.MemberValue?.ToString().ToSqlFilter(), parameter2.MemberName, parameter3.MemberName); ;
  510. }
  511. public virtual string FormatRowNumber(MethodCallExpressionModel model)
  512. {
  513. var str = model.Args[0].MemberValue.ObjToString();
  514. var array = model.Args.Skip(1).Select(it => it.IsMember ? it.MemberName : it.MemberValue).ToArray();
  515. if (array.Length == 1 && array[0] is string[])
  516. {
  517. return string.Format("'" + str + "'", array[0] as string[]); ;
  518. }
  519. else
  520. {
  521. return string.Format("'" + str + "'", array);
  522. }
  523. }
  524. public virtual string Format(MethodCallExpressionModel model)
  525. {
  526. var str ="'"+ model.Args[0].MemberValue.ObjToString()+"'";
  527. if (model.Args[0].MemberValue.ObjToString().StartsWith("'") && model.Args[0].MemberValue.ObjToString().EndsWith("'"))
  528. {
  529. str = model.Args[0].MemberValue.ObjToString() ;
  530. }
  531. var revalue = MergeString("'", "$1", "'");
  532. if (revalue.Contains("concat("))
  533. {
  534. return FormatConcat(model);
  535. }
  536. if (model.Args.Count == 2 && model.Args[1].MemberValue is string[])
  537. {
  538. List<MethodCallExpressionArgs> args = GetStringFormatArgs(str, model.Args[1].MemberValue as string[]);
  539. return Format(new MethodCallExpressionModel()
  540. {
  541. Args = args
  542. }); ;
  543. }
  544. str =Regex.Replace(str, @"(\{\d+?\})", revalue);
  545. var array = model.Args.Skip(1).Select(it => it.IsMember?it.MemberName:(it.MemberValue==null?"''":it.MemberValue.ToSqlValue()))
  546. .Select(it=>ToString(new MethodCallExpressionModel() { Args=new List<MethodCallExpressionArgs>() {
  547. new MethodCallExpressionArgs(){ IsMember=true, MemberName=it }
  548. } })).ToArray();
  549. return string.Format(""+str+ "", array);
  550. }
  551. private string FormatConcat(MethodCallExpressionModel model)
  552. {
  553. var str = "concat('" + model.Args[0].MemberValue.ObjToString() + "')";
  554. if (model.Args.Count == 2 && model.Args[1].MemberValue is string[])
  555. {
  556. List<MethodCallExpressionArgs> args = GetStringFormatArgs(str, model.Args[1].MemberValue as string[]);
  557. return Format(new MethodCallExpressionModel()
  558. {
  559. Args = args
  560. }); ;
  561. }
  562. str = Regex.Replace(str, @"(\{\d+?\})", "',$1,'");
  563. var array = model.Args.Skip(1).Select(it => it.IsMember ? it.MemberName : (it.MemberValue == null ? "''" : it.MemberValue.ToSqlValue()))
  564. .Select(it => ToString(new MethodCallExpressionModel()
  565. {
  566. Args = new List<MethodCallExpressionArgs>() {
  567. new MethodCallExpressionArgs(){ IsMember=true, MemberName=it }
  568. }
  569. })).ToArray();
  570. return string.Format("" + str + "", array);
  571. }
  572. public virtual string Abs(MethodCallExpressionModel model)
  573. {
  574. var parameter = model.Args[0];
  575. return string.Format(" ABS({0}) ", parameter.MemberName);
  576. }
  577. public virtual string Round(MethodCallExpressionModel model)
  578. {
  579. var parameter = model.Args[0];
  580. var parameter2= model.Args[1];
  581. return string.Format(" ROUND({0},{1}) ", parameter.MemberName, parameter2.MemberName);
  582. }
  583. public virtual string DateDiff(MethodCallExpressionModel model)
  584. {
  585. var parameter = model.Args[0];
  586. var parameter2 = model.Args[1];
  587. var parameter3 = model.Args[2];
  588. return string.Format(" DATEDIFF({0},{1},{2}) ", parameter.MemberValue?.ToString().ToSqlFilter(), parameter2.MemberName, parameter3.MemberName);
  589. }
  590. public virtual string GreaterThan(MethodCallExpressionModel model)
  591. {
  592. //>
  593. var parameter = model.Args[0];
  594. var parameter2 = model.Args[1];
  595. return string.Format(" ({0} > {1}) ", parameter.MemberName, parameter2.MemberName);
  596. }
  597. public virtual string GreaterThanOrEqual(MethodCallExpressionModel model)
  598. {
  599. //>=
  600. var parameter = model.Args[0];
  601. var parameter2 = model.Args[1];
  602. return string.Format(" ({0} >= {1}) ", parameter.MemberName, parameter2.MemberName);
  603. }
  604. public virtual string LessThan(MethodCallExpressionModel model)
  605. {
  606. //<
  607. var parameter = model.Args[0];
  608. var parameter2 = model.Args[1];
  609. return string.Format(" ({0} < {1}) ", parameter.MemberName, parameter2.MemberName);
  610. }
  611. public virtual string LessThanOrEqual(MethodCallExpressionModel model)
  612. {
  613. //<=
  614. var parameter = model.Args[0];
  615. var parameter2 = model.Args[1];
  616. return string.Format(" ({0} <= {1}) ", parameter.MemberName, parameter2.MemberName);
  617. }
  618. public virtual string Asc(MethodCallExpressionModel model)
  619. {
  620. return model.Args[0].MemberName + " ASC ";
  621. }
  622. public virtual string Desc(MethodCallExpressionModel model)
  623. {
  624. return model.Args[0].MemberName + " DESC ";
  625. }
  626. public virtual string Stuff(MethodCallExpressionModel model)
  627. {
  628. var parameter1 = model.Args[0];
  629. var parameter2 = model.Args[1];
  630. var parameter3 = model.Args[2];
  631. var parameter4 = model.Args[3];
  632. return $" STUFF ({parameter1.MemberName}, {parameter2.MemberName}, {parameter3.MemberName}, {parameter4.MemberName}) ";
  633. }
  634. public virtual string Exists(MethodCallExpressionModel model)
  635. {
  636. var parameter1 = model.Args[0];
  637. if (model.Args.Count > 1)
  638. {
  639. var parameter2 = model.Args[1];
  640. if (UtilMethods.IsParentheses(parameter1.MemberName))
  641. {
  642. parameter1.MemberName = $" {parameter1.MemberName.ObjToString().Trim().TrimEnd(')')} AND {parameter2.MemberName}) ";
  643. }
  644. else
  645. {
  646. parameter1.MemberName = $" {parameter1.MemberName} AND {parameter2.MemberName} ";
  647. }
  648. }
  649. if (UtilMethods.IsParentheses(parameter1.MemberName))
  650. {
  651. return $" Exists{parameter1.MemberName} ";
  652. }
  653. else
  654. {
  655. return $" Exists({parameter1.MemberName}) ";
  656. }
  657. }
  658. public virtual string GetDateString(string dateValue, string format)
  659. {
  660. return null;
  661. }
  662. public virtual string GetForXmlPath()
  663. {
  664. return null;
  665. }
  666. public virtual string JsonIndex(MethodCallExpressionModel model)
  667. {
  668. var parameter = model.Args[0];
  669. var parameter1 = model.Args[1];
  670. return $"({parameter.MemberName}::json ->> {parameter1.MemberValue})";
  671. }
  672. public virtual string JsonField(MethodCallExpressionModel model)
  673. {
  674. throw new NotImplementedException("Current database no support");
  675. }
  676. public virtual string JsonContainsFieldName(MethodCallExpressionModel model)
  677. {
  678. throw new NotImplementedException("Current database no support");
  679. }
  680. public virtual string JsonArrayLength(MethodCallExpressionModel model)
  681. {
  682. throw new NotImplementedException("Current database no support");
  683. }
  684. public virtual string JsonParse(MethodCallExpressionModel model)
  685. {
  686. throw new NotImplementedException("Current database no support");
  687. }
  688. public virtual string JsonLike(MethodCallExpressionModel model)
  689. {
  690. model.Args[0].MemberName = ToString(model);
  691. return Contains(model);
  692. }
  693. public virtual string Collate(MethodCallExpressionModel model)
  694. {
  695. var name=model.Args[0].MemberName;
  696. return $" {name} collate Chinese_PRC_CS_AS ";
  697. }
  698. public virtual string AggregateSumNoNull(MethodCallExpressionModel model)
  699. {
  700. model.Args.Add(new MethodCallExpressionArgs() { MemberValue = 0, MemberName = 0 });
  701. var name= IsNull(model);
  702. model.Args[0].MemberName = name;
  703. return AggregateSum(model);
  704. }
  705. public virtual string AggregateAvgNoNull(MethodCallExpressionModel model)
  706. {
  707. model.Args.Add(new MethodCallExpressionArgs() { MemberValue = 0, MemberName = 0 });
  708. var name = IsNull(model);
  709. model.Args[0].MemberName = name;
  710. return AggregateAvg(model);
  711. }
  712. public virtual string JsonListObjectAny(MethodCallExpressionModel model)
  713. {
  714. throw new NotImplementedException("Current database no support");
  715. }
  716. public virtual string JsonArrayAny(MethodCallExpressionModel model)
  717. {
  718. throw new NotImplementedException("Current database no support");
  719. }
  720. public virtual string CompareTo(MethodCallExpressionModel model)
  721. {
  722. var parameterNameA=model.Args[0].MemberName;
  723. var parameterNameB = model.Args[1].MemberName;
  724. return $"(case when {parameterNameA}>{parameterNameB} then 1 when {parameterNameA}={parameterNameB} then 0 else -1 end)";
  725. }
  726. public virtual string SplitIn(MethodCallExpressionModel model)
  727. {
  728. var fullString = model.Args[0].MemberName+"";
  729. var value = model.Args[1].MemberName+"";
  730. var value1 = MergeString(value, "','");
  731. var value2 = MergeString("','", value);
  732. var value3 = MergeString("','", value, "','");
  733. if (model.Args.Count == 3)
  734. {
  735. value1 = value1.Replace("','", model.Args[2].MemberName+"" );
  736. value2 = value2.Replace("','", model.Args[2].MemberName + "" );
  737. value3 = value3.Replace("','", model.Args[2].MemberName + "" );
  738. }
  739. var likeString1 =
  740. StartsWith(new MethodCallExpressionModel() { Args = new List<MethodCallExpressionArgs>() {
  741. new MethodCallExpressionArgs(){ IsMember=true, MemberName=fullString },
  742. new MethodCallExpressionArgs(){ IsMember=true, MemberName=value1 }
  743. } });
  744. var likeString2 =
  745. EndsWith(new MethodCallExpressionModel()
  746. {
  747. Args = new List<MethodCallExpressionArgs>() {
  748. new MethodCallExpressionArgs(){ IsMember=true, MemberName=fullString },
  749. new MethodCallExpressionArgs(){ IsMember=true, MemberName=value2 }
  750. }
  751. });
  752. var likeString3 =
  753. Contains(new MethodCallExpressionModel()
  754. {
  755. Args = new List<MethodCallExpressionArgs>() {
  756. new MethodCallExpressionArgs(){ IsMember=true, MemberName=fullString },
  757. new MethodCallExpressionArgs(){ IsMember=true, MemberName=value3 }
  758. }
  759. });
  760. return $" ({likeString1} or {likeString2} or {likeString3} or {fullString}={value} ) ";
  761. }
  762. public string Like(MethodCallExpressionModel model)
  763. {
  764. var parameter = model.Args[0];
  765. var parameter2 = model.Args[1];
  766. return string.Format(" ({0} like {1} ) ", parameter.MemberName, parameter2.MemberName);
  767. }
  768. public string ToSingle(MethodCallExpressionModel model)
  769. {
  770. return ToDecimal(model);
  771. }
  772. public string ListAny(MethodCallExpressionModel model)
  773. {
  774. if (IsArrayAnyParameter(model))
  775. {
  776. return ListArrayAny(model);
  777. }
  778. StringBuilder sb = new StringBuilder();
  779. if (model.Args[0].MemberValue!=null&&(model.Args[0].MemberValue as IList).Count>0)
  780. {
  781. sb.Append(" ( ");
  782. var listPar = model.Args[1].MemberValue as ListAnyParameter;
  783. foreach (var item in (model.Args[0].MemberValue as IList))
  784. {
  785. var sql = listPar.Sql;
  786. if (sb.Length > 3)
  787. {
  788. sb.Append("OR");
  789. }
  790. foreach (var columnInfo in listPar.Columns)
  791. {
  792. var replace = listPar.ConvetColumnFunc($"{listPar.Name}.{columnInfo.DbColumnName}");
  793. if(sql.Contains(replace))
  794. {
  795. var value = columnInfo.PropertyInfo.GetValue(item);
  796. var newValue = "null";
  797. if (value != null)
  798. {
  799. if (UtilMethods.IsNumber(columnInfo.UnderType.Name))
  800. {
  801. newValue = value.ToString();
  802. }
  803. else if(columnInfo.UnderType==SqlSugar.UtilConstants.GuidType)
  804. {
  805. newValue = ToGuid(new MethodCallExpressionModel()
  806. {
  807. Args=new List<MethodCallExpressionArgs>()
  808. {
  809. new MethodCallExpressionArgs(){
  810. MemberValue=value.ToSqlValue(),
  811. MemberName=value.ToSqlValue()
  812. }
  813. }
  814. });
  815. }
  816. else if (columnInfo.UnderType == SqlSugar.UtilConstants.DateType)
  817. {
  818. newValue = ToDate(new MethodCallExpressionModel()
  819. {
  820. Args = new List<MethodCallExpressionArgs>()
  821. {
  822. new MethodCallExpressionArgs(){
  823. MemberValue=UtilMethods.GetConvertValue( value).ToSqlValue(),
  824. MemberName=UtilMethods.GetConvertValue( value).ToSqlValue()
  825. }
  826. }
  827. });
  828. }
  829. else
  830. {
  831. newValue = value.ToSqlValue();
  832. }
  833. }
  834. sql = sql.Replace(replace, newValue);
  835. }
  836. }
  837. sb.Append(sql);
  838. }
  839. sb.Append(" ) ");
  840. }
  841. var result = sb.ToString();
  842. if (result.IsNullOrEmpty())
  843. {
  844. return " 1=2 ";
  845. }
  846. else
  847. {
  848. return result;
  849. }
  850. }
  851. public string ListAll(MethodCallExpressionModel model)
  852. {
  853. if (IsArrayAnyParameter(model))
  854. {
  855. return ListArrayAny(model);
  856. }
  857. StringBuilder sb = new StringBuilder();
  858. if (model.Args[0].MemberValue != null && (model.Args[0].MemberValue as IList).Count > 0)
  859. {
  860. sb.Append(" ( ");
  861. var listPar = model.Args[1].MemberValue as ListAnyParameter;
  862. foreach (var item in (model.Args[0].MemberValue as IList))
  863. {
  864. var sql = listPar.Sql;
  865. if (sb.Length > 3)
  866. {
  867. sb.Append("AND");
  868. }
  869. foreach (var columnInfo in listPar.Columns)
  870. {
  871. var replace = listPar.ConvetColumnFunc($"{listPar.Name}.{columnInfo.DbColumnName}");
  872. if (sql.Contains(replace))
  873. {
  874. var value = columnInfo.PropertyInfo.GetValue(item);
  875. var newValue = "null";
  876. if (value != null)
  877. {
  878. if (UtilMethods.IsNumber(columnInfo.UnderType.Name))
  879. {
  880. newValue = value.ToString();
  881. }
  882. else if (columnInfo.UnderType == SqlSugar.UtilConstants.GuidType)
  883. {
  884. newValue = ToGuid(new MethodCallExpressionModel()
  885. {
  886. Args = new List<MethodCallExpressionArgs>()
  887. {
  888. new MethodCallExpressionArgs(){
  889. MemberValue=value.ToSqlValue(),
  890. MemberName=value.ToSqlValue()
  891. }
  892. }
  893. });
  894. }
  895. else if (columnInfo.UnderType == SqlSugar.UtilConstants.DateType)
  896. {
  897. newValue = ToDate(new MethodCallExpressionModel()
  898. {
  899. Args = new List<MethodCallExpressionArgs>()
  900. {
  901. new MethodCallExpressionArgs(){
  902. MemberValue=UtilMethods.GetConvertValue( value).ToSqlValue(),
  903. MemberName=UtilMethods.GetConvertValue( value).ToSqlValue()
  904. }
  905. }
  906. });
  907. }
  908. else
  909. {
  910. newValue = value.ToSqlValue();
  911. }
  912. }
  913. sql = sql.Replace(replace, newValue);
  914. }
  915. }
  916. sb.Append(sql);
  917. }
  918. sb.Append(" ) ");
  919. }
  920. var result = sb.ToString();
  921. if (result.IsNullOrEmpty())
  922. {
  923. return " 1=2 ";
  924. }
  925. else
  926. {
  927. return result;
  928. }
  929. }
  930. public virtual string GetTableWithDataBase(string dataBaseName,string tableName)
  931. {
  932. return $"{dataBaseName}.{tableName}";
  933. }
  934. public virtual string Modulo(MethodCallExpressionModel model)
  935. {
  936. return "("+model.Args[0].MemberName + " % "+ model.Args[1].MemberName+")";
  937. }
  938. private static bool IsArrayAnyParameter(MethodCallExpressionModel model)
  939. {
  940. var memberValue = model?.Args?.FirstOrDefault()?.MemberValue;
  941. return UtilMethods.IsValueTypeArray(memberValue);
  942. }
  943. private string ListArrayAny(MethodCallExpressionModel model)
  944. {
  945. StringBuilder sb = new StringBuilder();
  946. if (model.Args[0].MemberValue != null && (model.Args[0].MemberValue as IList).Count > 0)
  947. {
  948. sb.Append(" ( ");
  949. var listPar = model.Args[1].MemberValue as ListAnyParameter;
  950. foreach (var item in (model.Args[0].MemberValue as IList))
  951. {
  952. var sql = listPar.Sql;
  953. if (sb.Length > 3)
  954. {
  955. sb.Append("OR");
  956. }
  957. foreach (var columnInfo in listPar.Columns)
  958. {
  959. var value = item;
  960. var newValue = "null";
  961. if (value != null)
  962. {
  963. if (columnInfo.DbTableName!= "String" && UtilMethods.IsNumber(columnInfo.UnderType.Name))
  964. {
  965. newValue = value.ToString();
  966. }
  967. else if (columnInfo.UnderType == SqlSugar.UtilConstants.GuidType)
  968. {
  969. newValue = ToGuid(new MethodCallExpressionModel()
  970. {
  971. Args = new List<MethodCallExpressionArgs>()
  972. {
  973. new MethodCallExpressionArgs(){
  974. MemberValue=value.ToSqlValue(),
  975. MemberName=value.ToSqlValue()
  976. }
  977. }
  978. });
  979. }
  980. else if (columnInfo.UnderType == SqlSugar.UtilConstants.DateType)
  981. {
  982. newValue = ToDate(new MethodCallExpressionModel()
  983. {
  984. Args = new List<MethodCallExpressionArgs>()
  985. {
  986. new MethodCallExpressionArgs(){
  987. MemberValue=UtilMethods.GetConvertValue( value).ToSqlValue(),
  988. MemberName=UtilMethods.GetConvertValue( value).ToSqlValue()
  989. }
  990. }
  991. });
  992. }
  993. else
  994. {
  995. newValue = value.ToSqlValue();
  996. }
  997. }
  998. //Regex regex = new Regex("\@");
  999. if (!sql.Contains(ParameterKeyWord))
  1000. {
  1001. sql = sql.Replace(" =)", $" = {newValue})");
  1002. if (!sql.Contains(newValue))
  1003. {
  1004. sql = sql.Replace(" )", $" = {newValue})");
  1005. }
  1006. }
  1007. else
  1008. {
  1009. Regex reg = new Regex(ParameterKeyWord + @"MethodConst\d+");
  1010. sql = reg.Replace(sql, it =>
  1011. {
  1012. return " " + newValue + " ";
  1013. });
  1014. }
  1015. }
  1016. sb.Append(sql);
  1017. }
  1018. sb.Append(" ) ");
  1019. }
  1020. var result = sb.ToString();
  1021. if (result.IsNullOrEmpty())
  1022. {
  1023. return " 1=2 ";
  1024. }
  1025. else
  1026. {
  1027. return result;
  1028. }
  1029. }
  1030. private static List<MethodCallExpressionArgs> GetStringFormatArgs(string str, object array)
  1031. {
  1032. var args = new List<MethodCallExpressionArgs>()
  1033. {
  1034. new MethodCallExpressionArgs(){
  1035. MemberName=str,
  1036. MemberValue=str
  1037. }
  1038. };
  1039. args.AddRange((array as string[]).Select(it => new MethodCallExpressionArgs()
  1040. {
  1041. MemberValue = it,
  1042. MemberName = it,
  1043. IsMember = (it?.StartsWith("[") == true || it?.StartsWith("`") == true || it?.StartsWith("\"") == true)
  1044. &&
  1045. (it?.EndsWith("]") == true || it?.EndsWith("`") == true || it?.EndsWith("\"") == true)
  1046. }));
  1047. return args;
  1048. }
  1049. public virtual string WeekOfYear(MethodCallExpressionModel mode)
  1050. {
  1051. var parameterNameA = mode.Args[0].MemberName;
  1052. return $" DATE_PART('week', {parameterNameA})+1 ";
  1053. }
  1054. public virtual string TrimEnd(MethodCallExpressionModel mode)
  1055. {
  1056. var parameterNameA = mode.Args[0].MemberName;
  1057. var parameterNameB= mode.Args[1].MemberName;
  1058. return $" CASE WHEN RIGHT({parameterNameA}, 1) = {parameterNameB} THEN LEFT({parameterNameA}, LENGTH({parameterNameA}) - 1) ELSE {parameterNameA} END ";
  1059. }
  1060. public virtual string TrimStart(MethodCallExpressionModel mode)
  1061. {
  1062. var parameterNameA = mode.Args[0].MemberName;
  1063. var parameterNameB = mode.Args[1].MemberName;
  1064. return $" CASE WHEN LEFT({parameterNameA}, 1) = {parameterNameB} THEN RIGHT({parameterNameA}, LEN({parameterNameA}) - 1) ELSE {parameterNameA} END ";
  1065. }
  1066. public virtual string Left(MethodCallExpressionModel mode)
  1067. {
  1068. var parameterNameA = mode.Args[0].MemberName;
  1069. var parameterNameB = mode.Args[1].MemberName;
  1070. return $" LEFT({parameterNameA},{parameterNameB}) ";
  1071. }
  1072. public virtual string Right(MethodCallExpressionModel mode)
  1073. {
  1074. var parameterNameA = mode.Args[0].MemberName;
  1075. var parameterNameB = mode.Args[1].MemberName;
  1076. return $" RIGHT({parameterNameA},{parameterNameB}) ";
  1077. }
  1078. public virtual string PadLeft(MethodCallExpressionModel mode)
  1079. {
  1080. var parameterNameA = mode.Args[0].MemberName;
  1081. var parameterNameB = mode.Args[1].MemberName;
  1082. var parameterNameC = mode.Args[2].MemberName;
  1083. return $" LPAD({parameterNameA},{parameterNameB},{parameterNameC}) ";
  1084. }
  1085. public virtual string Floor(MethodCallExpressionModel mode)
  1086. {
  1087. var parameterNameA = mode.Args[0].MemberName;
  1088. return $" FLOOR({parameterNameA})";
  1089. }
  1090. public virtual string Ceil(MethodCallExpressionModel mode)
  1091. {
  1092. var parameterNameA = mode.Args[0].MemberName;
  1093. return $" CEILING({parameterNameA}) ";
  1094. }
  1095. public virtual string NewUid(MethodCallExpressionModel mode)
  1096. {
  1097. return $" uuid_generate_v4() ";
  1098. }
  1099. public virtual string FullTextContains(MethodCallExpressionModel mode)
  1100. {
  1101. var columns = mode.Args[0].MemberName;
  1102. if (mode.Args[0].MemberValue is List<string>)
  1103. {
  1104. columns = string.Join("|| ' ' ||", mode.Args[0].MemberValue as List<string>) ;
  1105. }
  1106. var searchWord = mode.Args[1].MemberName;
  1107. return $"to_tsvector('chinese', {columns}) @@ to_tsquery('chinese', {searchWord})";
  1108. }
  1109. }
  1110. }