SQLHelperParametric.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Text.Json;
  8. using System.Text.RegularExpressions;
  9. using TEAMModelOS.SDK.Context.Exception;
  10. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  11. namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
  12. {
  13. public class SQLHelperParametric
  14. {
  15. static readonly string[] LogicOpers = new string[] { " and ", " or " };
  16. static readonly string[] CompareOpers = new string[] { " > ", " < ", " <= ", " >= ", " = ", " != ", " like ", " not like ", " in " };
  17. public static void ReplaceKeyWords(ref StringBuilder sql)
  18. {
  19. sql.Replace(".order.", "['order'].");
  20. sql.Replace(".order ", "['order'] ");
  21. sql.Replace(".Order.", "['Order'].");
  22. sql.Replace(".Order ", "['Order'] ");
  23. sql.Replace(".group.", "['group'].");
  24. sql.Replace(".group ", "['group'] ");
  25. sql.Replace(".Group.", "['Group'].");
  26. sql.Replace(".Group ", "['Group'] ");
  27. sql.Replace(".end.", "['end'].");
  28. sql.Replace(".end ", "['end'] ");
  29. sql.Replace(".End.", "['End'].");
  30. sql.Replace(".End ", "['End'] ");
  31. sql.Replace(".having.", "['having'].");
  32. sql.Replace(".having ", "['having'] ");
  33. sql.Replace(".Having.", "['Having'].");
  34. sql.Replace(".Having ", "['Having'] ");
  35. }
  36. public static StringBuilder GetSQLSelect(List<string> propertys)
  37. {
  38. StringBuilder sql;
  39. if (propertys.IsNotEmpty())
  40. {
  41. string tmpSQL = " select ";
  42. int i = 0;
  43. foreach (string item in propertys)
  44. {
  45. if (i == 0)
  46. {
  47. tmpSQL += " c." + item + " ";
  48. }
  49. else
  50. {
  51. tmpSQL += " ,c." + item + " ";
  52. }
  53. i++;
  54. }
  55. tmpSQL += "from c";
  56. sql = new StringBuilder(tmpSQL);
  57. }
  58. else
  59. {
  60. sql = new StringBuilder("select value(c) from c");
  61. }
  62. return sql;
  63. }
  64. public static void DictIsNotNULL(Dictionary<string, object> dict)
  65. {
  66. Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
  67. foreach (KeyValuePair<string, object> keyValuePair in dict)
  68. {
  69. if (keyValuePair.Value is JArray array)
  70. {
  71. if (array == null || array.Count == 0) keyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
  72. }
  73. else if (keyValuePair.Value is IList enumerable && !(keyValuePair.Value is String))
  74. {
  75. if (enumerable == null || enumerable.Count == 0) keyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
  76. }
  77. else if (keyValuePair.Value is JsonElement jsonElement && jsonElement.ValueKind is JsonValueKind.Array)
  78. {
  79. if (jsonElement.EnumerateArray().Count() == 0)
  80. {
  81. keyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
  82. }
  83. }
  84. else if (keyValuePair.Value is null)
  85. {
  86. keyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
  87. }
  88. }
  89. if (keyValuePairs.Count > 0)
  90. {
  91. foreach (KeyValuePair<string, object> keyValuePair in keyValuePairs)
  92. {
  93. dict.Remove(keyValuePair.Key);
  94. }
  95. }
  96. }
  97. public static CosmosDbQuery GetSQL(Dictionary<string, object> dict, StringBuilder sql)
  98. {
  99. if (dict != null)
  100. {
  101. DictIsNotNULL(dict);
  102. Dictionary<string, object> parmeters = new Dictionary<string, object>();
  103. int offsetNum = -1;
  104. int limitNum = 0;
  105. bool pageBool = false;
  106. GetPageNum(dict, ref offsetNum, ref limitNum, ref pageBool);
  107. string OrderByValue = "";
  108. // 处理OrderBy
  109. if (dict.TryGetValue("@ASC", out object ASC))
  110. {
  111. OrderByValue = Regex.Replace(ASC.ToString(), "\\s{1,}", "");
  112. dict.Remove("@ASC");
  113. }
  114. if (dict.TryGetValue("@DESC", out object DESC))
  115. {
  116. OrderByValue = Regex.Replace(DESC.ToString(), "\\s{1,}", "");
  117. dict.Remove("@DESC");
  118. };
  119. //处理顺序
  120. Stack<KeyValuePair<string, object>> stack = new Stack<KeyValuePair<string, object>>();
  121. foreach (string item in dict.Keys)
  122. {
  123. if (item.EndsWith(".|"))
  124. {
  125. stack.Push(new KeyValuePair<string, object>(item, dict[item]));
  126. }
  127. }
  128. foreach (string item in dict.Keys)
  129. {
  130. if (!item.EndsWith(".|"))
  131. {
  132. stack.Push(new KeyValuePair<string, object>(item, dict[item]));
  133. }
  134. }
  135. string Join = " join ";
  136. string instring = " in ";
  137. Dictionary<string, string> keyValues = new Dictionary<string, string>();
  138. StringBuilder WhereString = new StringBuilder();
  139. int heada = 0;
  140. string[] sqlHead = new string[] { "A", "B", "C", "D", "E", "F" };
  141. int kslength = 0;
  142. int logicOperNum = 0;
  143. bool keyListValueList = true;
  144. int keyListValueListNum = 0;
  145. int stackCount = stack.Count;
  146. for (int k = 0; k < stackCount; k++)
  147. {
  148. KeyValuePair<string, object> item = stack.Pop();
  149. bool isLikeSQL = false;
  150. if (item.Key.StartsWith("$.") || item.Key.StartsWith("!$."))
  151. {
  152. isLikeSQL = true;
  153. }
  154. string key = item.Key;
  155. string[] keyHead = key.Split(".");
  156. int index = 0;
  157. int compareOper = 4;
  158. int logicOper = 0;
  159. if (key.EndsWith(".&"))
  160. {
  161. logicOper = (int)LogicOper.and;
  162. key = key.Replace(".&", "");
  163. }
  164. else if (key.EndsWith(".|"))
  165. {
  166. logicOper = (int)LogicOper.or;
  167. key = key.Replace(".|", "");
  168. }
  169. CompareOperSwitch(keyHead[0], ref key, ref compareOper);
  170. string[] keyBody = key.Split("[*]");
  171. if (keyBody.Length > 1)
  172. {
  173. key = key.Replace("[*]", "");
  174. key = key.Replace(".", "");
  175. kslength += keyBody.Length;
  176. if (kslength < (7 + heada))
  177. {
  178. StringBuilder sqlitem = new StringBuilder();
  179. for (int i = 0; i < keyBody.Length - 1; i++)
  180. {
  181. //Console.WriteLine(ks[i]);
  182. if (i == 0)
  183. {
  184. sqlitem.Append(Join);
  185. string a = sqlHead[heada] + index;
  186. sqlitem.Append(a + " ");
  187. //keyValues.Add(ks[i], a);
  188. keyValues[keyBody[i]] = a;
  189. sqlitem.Append(instring);
  190. sqlitem.Append("c.");
  191. sqlitem.Append(keyBody[i]);
  192. }
  193. else
  194. {
  195. sqlitem.Append(Join);
  196. string a = sqlHead[heada] + index;
  197. sqlitem.Append(a + " ");
  198. //keyValues.Add(ks[i], a);
  199. keyValues[keyBody[i]] = a;
  200. sqlitem.Append(instring);
  201. sqlitem.Append(keyValues[keyBody[i - 1]]);
  202. sqlitem.Append(keyBody[i]);
  203. }
  204. index += 1;
  205. }
  206. sql.Append(sqlitem);
  207. string s = "";
  208. if (isLikeSQL)
  209. {
  210. s = ValueIsLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", key, item.Value, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
  211. }
  212. else
  213. {
  214. s = ValueNotLike(sqlHead[heada] + (keyBody.Length - 2) + keyBody[index] + "", key, item.Value, LogicOpers[logicOper], logicOperNum, compareOper, ref keyListValueList);
  215. }
  216. WhereString.Append(s);
  217. if (keyListValueList && keyListValueListNum == 0)
  218. {
  219. sql = sql.Replace("select ", "select distinct ");
  220. keyListValueList = false;
  221. keyListValueListNum++;
  222. }
  223. }
  224. else
  225. {
  226. throw new BizException("数组总共深度不能超过5层", ResponseCode.PARAMS_ERROR);
  227. }
  228. heada += 1;
  229. }
  230. else
  231. {
  232. string itemKey = key.Replace(".", "");
  233. WhereString.Append(KeyNotElement(dict[item.Key], item.Key, itemKey, LogicOpers[logicOper], logicOperNum, compareOper));
  234. }
  235. logicOperNum += 1;
  236. }
  237. sql.Append(" where 1=1 ").Append(WhereString);
  238. if (ASC != null)
  239. {
  240. sql.Append(" Order By c." + OrderByValue );
  241. //sql.Append(" Order By c." + "@OrderByValue");
  242. }
  243. else if (DESC != null) {
  244. sql.Append(" Order By c." + OrderByValue + " DESC ");
  245. // sql.Append(" Order By c." + "@OrderByValue"+ " DESC " );
  246. }
  247. if (pageBool && offsetNum != -1 && limitNum != 0)
  248. {
  249. //sql.Append(" OFFSET " + offsetNum + " LIMIT " + limitNum);
  250. sql.Append(" OFFSET " + " @offsetNum " + " LIMIT " + " @limitNum ");
  251. }
  252. //替换关键字
  253. ReplaceKeyWords(ref sql);
  254. //参数化查询拼接 参数dict
  255. parmeters = GetParmeter(dict, parmeters, offsetNum, limitNum);
  256. CosmosDbQuery cosmosDbQuery = new CosmosDbQuery
  257. {
  258. QueryText = sql.ToString(),
  259. Parameters = parmeters
  260. };
  261. return cosmosDbQuery;
  262. }
  263. return null;
  264. }
  265. private static void GetPageNum(Dictionary<string, object> dict, ref int offsetNum, ref int limitNum, ref bool pageBool)
  266. {
  267. dict.TryGetValue("@CURRPAGE", out object page);
  268. dict.Remove("@CURRPAGE");
  269. dict.TryGetValue("@PAGESIZE", out object limit);
  270. dict.Remove("@PAGESIZE");
  271. if (page != null && limit != null)
  272. {
  273. pageBool = true;
  274. limitNum = int.Parse(limit.ToString());
  275. if (limitNum < 0) {
  276. throw new BizException("PAGESIZE can't be less than 0 !");
  277. }
  278. offsetNum = (int.Parse(page.ToString()) - 1) * limitNum;
  279. if (offsetNum < 0) {
  280. throw new BizException("CURRPAGE can't be less than 1 !");
  281. }
  282. }
  283. }
  284. private static void CompareOperSwitch(string keyHead, ref string key, ref int compareOper)
  285. {
  286. switch (keyHead)
  287. {
  288. case ">":
  289. compareOper = (int)CompareOper.moreThan;
  290. key = key.Replace(">.", "");
  291. break;
  292. case "<":
  293. compareOper = (int)CompareOper.lessThan;
  294. key = key.Replace("<.", "");
  295. break;
  296. case "<=":
  297. compareOper = (int)CompareOper.notMoreThan;
  298. key = key.Replace("<=.", "");
  299. break;
  300. case ">=":
  301. compareOper = (int)CompareOper.notLessThan;
  302. key = key.Replace(">=.", "");
  303. break;
  304. case "=":
  305. compareOper = (int)CompareOper.equal;
  306. key = key.Replace("=.", "");
  307. break;
  308. case "!=":
  309. compareOper = (int)CompareOper.notEqual;
  310. key = key.Replace("!=.", "");
  311. break;
  312. case "$":
  313. compareOper = (int)CompareOper.like;
  314. key = key.Replace("$.", "");
  315. break;
  316. case "!$":
  317. compareOper = (int)CompareOper.notLike;
  318. key = key.Replace("!$.", "");
  319. break;
  320. default:
  321. compareOper = 4;
  322. break;
  323. }
  324. }
  325. private static string ValueNotLike(string key, string key1, object value, string logicOperParams, int logicOperNum, int compareOperNum, ref bool keyListValueList)
  326. {
  327. string logicOper = " and ";
  328. string compareOper = " = ";
  329. if (compareOperNum != 4) compareOper = CompareOpers[compareOperNum];
  330. if (logicOperNum != 0) logicOper = logicOperParams;
  331. StringBuilder sql = new StringBuilder(logicOper + key + " in (");
  332. if (value is JArray array)
  333. {
  334. int aa = 0;
  335. foreach (JValue obja in array)
  336. {
  337. sql.Append(" @" + key1 + aa + " ,");
  338. aa++;
  339. }
  340. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  341. sqls += " ) ";
  342. return sqls;
  343. }
  344. else if (value is IEnumerable enumerable && !(value is String))
  345. {
  346. int aa = 0;
  347. foreach (object obja in enumerable)
  348. {
  349. sql.Append(" @" + key1 + aa + " ,");
  350. aa++;
  351. }
  352. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  353. sqls += ") ";
  354. return sqls;
  355. }
  356. else if (value is JsonElement jsonElement)
  357. {
  358. if (jsonElement.ValueKind is JsonValueKind.Array)
  359. {
  360. int aa = 0;
  361. foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
  362. {
  363. sql.Append(" @" + key1 + aa + " ,");
  364. aa++;
  365. }
  366. }
  367. else
  368. {
  369. if (compareOperNum == 4) keyListValueList = false;
  370. return logicOper + key + compareOper + " @" + key1 + " ";
  371. }
  372. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  373. sqls += " ) ";
  374. return sqls;
  375. }
  376. else
  377. {
  378. Type s = value.GetType();
  379. TypeCode typeCode = Type.GetTypeCode(s);
  380. if (compareOperNum == 4) keyListValueList = false;
  381. return logicOper + key + compareOper + " @" + key1 + " ";
  382. }
  383. }
  384. private static string ValueIsLike(string key, string key1, object value, string logicOperParams, int logicOperNum, int compareOperNum, ref bool keyListValueList)
  385. {
  386. string compareOperBool = " true ";
  387. compareOperBool = CompareBoolSwitch(compareOperNum);
  388. string logicOper = " and ";
  389. if (logicOperNum != 0) logicOper = logicOperParams;
  390. StringBuilder s = new StringBuilder(logicOper + " ( Contains( ");
  391. if (value is JArray array)
  392. {
  393. int aa = 0;
  394. foreach (JValue obja in array)
  395. {
  396. if (aa != 0) s.Append("or Contains(");
  397. s.Append(key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  398. if (obja.Value is string)
  399. {
  400. s.Append(key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  401. }
  402. else
  403. {
  404. s.Append("ToString( " + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  405. }
  406. aa++;
  407. }
  408. }
  409. else if (value is IEnumerable enumerable && !(value is String))
  410. {
  411. int aa = 0;
  412. foreach (object obja in enumerable)
  413. {
  414. if (aa != 0) s.Append("or Contains(");
  415. if (obja is string)
  416. {
  417. s.Append(key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  418. }
  419. else
  420. {
  421. s.Append("ToString( " + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  422. }
  423. aa++;
  424. }
  425. }
  426. else if (value is JsonElement jsonElement && jsonElement.ValueKind is JsonValueKind.Array)
  427. {
  428. int aa = 0;
  429. foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
  430. {
  431. if (aa != 0) s.Append("or Contains(");
  432. if (obja.ValueKind is JsonValueKind.String)
  433. {
  434. s.Append(key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  435. }
  436. else
  437. {
  438. s.Append("ToString( " + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  439. }
  440. aa++;
  441. }
  442. }
  443. else
  444. {
  445. Type stype = value.GetType();
  446. TypeCode typeCode = Type.GetTypeCode(stype);
  447. keyListValueList = false;
  448. string sql = "";
  449. if (value is string)
  450. {
  451. sql = logicOper + "Contains( " + key + " , @" + key1 + " ) = " + compareOperBool + " ";
  452. }
  453. else if (value is JsonElement jsonElement1 && jsonElement1.ValueKind is JsonValueKind.String)
  454. {
  455. sql = logicOper + "Contains( " + key + " , @" + key1 + " ) = " + compareOperBool + " ";
  456. }
  457. else
  458. {
  459. sql = logicOper + "Contains( ToString(" + key + " ), \'@" + key1 + "\' ) = " + compareOperBool + " ";
  460. }
  461. return sql;
  462. }
  463. s.Append(" )");
  464. return s.ToString();
  465. }
  466. private static string CompareBoolSwitch(int compareOperNum)
  467. {
  468. return compareOperNum switch
  469. {
  470. 6 => " true ",
  471. 7 => " false ",
  472. _ => " true ",
  473. };
  474. }
  475. private static string KeyNotElement(object value, string key, string key1, string logicOperParams, int logicOperNum, int compareOperNum)
  476. {
  477. string compareOperBool = " true ";
  478. compareOperBool = CompareBoolSwitch(compareOperNum);
  479. string logicOper = " and ";
  480. int compareOper = 4;
  481. if (logicOperNum != 0) logicOper = logicOperParams;
  482. if (key.EndsWith(".&"))
  483. {
  484. key = key.Replace(".&", "");
  485. }
  486. else if (key.EndsWith(".|"))
  487. {
  488. key = key.Replace(".|", "");
  489. }
  490. string[] keyHead = key.Split(".");
  491. CompareOperSwitch(keyHead[0], ref key, ref compareOper);
  492. if (compareOper == 6 || compareOper == 7)
  493. {
  494. StringBuilder sql = new StringBuilder(logicOper + " ( Contains( ");
  495. if (value is JArray jarray)
  496. {
  497. int aa = 0;
  498. foreach (JValue obja in jarray)
  499. {
  500. if (aa != 0) sql.Append("or Contains(");
  501. if (obja.Value is string)
  502. {
  503. sql.Append(" c." + key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  504. }
  505. else
  506. {
  507. sql.Append("ToString( c." + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  508. }
  509. sql.Append(" c." + key + ", @" + key1 + aa + " )= " + compareOperBool + " ");
  510. aa++;
  511. }
  512. }
  513. else if (value is IEnumerable enumerable && !(value is String))
  514. {
  515. int aa = 0;
  516. foreach (object obja in enumerable)
  517. {
  518. if (aa != 0) sql.Append("or Contains(");
  519. if (obja is string)
  520. {
  521. sql.Append(" c." + key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  522. }
  523. else
  524. {
  525. sql.Append("ToString( c." + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  526. }
  527. aa++;
  528. }
  529. }
  530. else if (value is JsonElement jsonElement && jsonElement.ValueKind is JsonValueKind.Array)
  531. {
  532. int aa = 0;
  533. foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
  534. {
  535. if (aa != 0) sql.Append("or Contains(");
  536. if (obja.ValueKind is JsonValueKind.String)
  537. {
  538. sql.Append(" c." + key + "," + " @" + key1 + aa + " ) = " + compareOperBool + " ");
  539. }
  540. else
  541. {
  542. sql.Append("ToString( c." + key + " )," + " \'@" + key1 + aa + "\' ) = " + compareOperBool + " ");
  543. }
  544. aa++;
  545. }
  546. }
  547. else
  548. {
  549. Type s = value.GetType();
  550. TypeCode typeCode = Type.GetTypeCode(s);
  551. string sql1 = "";
  552. if (value is string)
  553. {
  554. sql1 = logicOper + "Contains( c." + key + " , @" + key1 + " ) = " + compareOperBool + " ";
  555. }
  556. if (value is JsonElement jsonElement1 && jsonElement1.ValueKind is JsonValueKind.String)
  557. {
  558. sql1 = logicOper + "Contains( c." + key + " , @" + key1 + " ) = " + compareOperBool + " ";
  559. }
  560. else
  561. {
  562. sql1 = logicOper + "Contains( ToString( c." + key + " ), \'@" + key1 + "\' ) = " + compareOperBool + " ";
  563. }
  564. return sql1;
  565. }
  566. sql.Append(")");
  567. return sql.ToString();
  568. }
  569. else
  570. {
  571. StringBuilder sql = new StringBuilder(logicOper + " c." + key + " in (");
  572. if (value is JArray array)
  573. {
  574. int aa = 0;
  575. foreach (JValue obja in array)
  576. {
  577. sql.Append(" @" + key1 + aa + " ,");
  578. aa++;
  579. }
  580. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  581. sqls += " ) ";
  582. return sqls;
  583. }
  584. else if (value is IEnumerable enumerable && !(value is String))
  585. {
  586. int aa = 0;
  587. foreach (object obja in enumerable)
  588. {
  589. sql.Append(" @" + key1 + aa + " ,");
  590. aa++;
  591. }
  592. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  593. sqls += " ) ";
  594. return sqls;
  595. }
  596. else if (value is JsonElement jsonElement)
  597. {
  598. if (jsonElement.ValueKind is JsonValueKind.Array)
  599. {
  600. int aa = 0;
  601. foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
  602. {
  603. sql.Append(" @" + key1 + aa + " ,");
  604. aa++;
  605. }
  606. }
  607. else
  608. {
  609. return logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1;
  610. }
  611. string sqls = sql.ToString().Substring(0, sql.Length - 1);
  612. sqls += " ) ";
  613. return sqls;
  614. }
  615. else
  616. {
  617. Type s = value.GetType();
  618. TypeCode typeCode = Type.GetTypeCode(s);
  619. return typeCode switch
  620. {
  621. TypeCode.String => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + "\'" + value.ToString() + "\'",
  622. TypeCode.Char => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + "\'" + value.ToString() + "\'",
  623. TypeCode.Int32 => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + int.Parse(value.ToString()),
  624. TypeCode.Double => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + double.Parse(value.ToString()),
  625. TypeCode.Boolean => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + bool.Parse(value.ToString()),
  626. TypeCode.DateTime => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + (DateTime)value,
  627. TypeCode.Int64 => logicOper + " c." + key + CompareOpers[compareOperNum] + " @" + key1,// + long.Parse(value.ToString()),
  628. _ => null,
  629. };
  630. }
  631. }
  632. }
  633. public enum LogicOper : int
  634. {
  635. and = 0, or = 1
  636. }
  637. public enum CompareOper : int
  638. {
  639. moreThan = 0, lessThan = 1, notMoreThan = 2, notLessThan = 3, equal = 4, notEqual = 5, like = 6, notLike = 7, IN = 8
  640. }
  641. private static Dictionary<string, object> GetParmeter(Dictionary<string, object> dict, Dictionary<string, object> parmeters,int offset = 0,int limit = 0)
  642. {
  643. foreach (KeyValuePair<string, object> keyValue in dict)
  644. {
  645. string key = "";
  646. string[] keyHead = keyValue.Key.Split(".");
  647. switch (keyHead[0])
  648. {
  649. case ">":
  650. key = keyValue.Key.Replace(">.", "");
  651. break;
  652. case "<":
  653. key = keyValue.Key.Replace("<.", "");
  654. break;
  655. case "<=":
  656. key = keyValue.Key.Replace("<=.", "");
  657. break;
  658. case ">=":
  659. key = keyValue.Key.Replace(">=.", "");
  660. break;
  661. case "=":
  662. key = keyValue.Key.Replace("=.", "");
  663. break;
  664. case "!=":
  665. key = keyValue.Key.Replace("!=.", "");
  666. break;
  667. case "$":
  668. key = keyValue.Key.Replace("$.", "");
  669. break;
  670. case "!$":
  671. key = keyValue.Key.Replace("!$.", "");
  672. break;
  673. default:
  674. key = keyValue.Key;
  675. break;
  676. }
  677. if (key.EndsWith(".&"))
  678. {
  679. key = key.Replace(".&", "");
  680. }
  681. else if (key.EndsWith(".|"))
  682. {
  683. key = key.Replace(".|", "");
  684. }
  685. key = key.Replace("[*]", "");
  686. key = key.Replace(".", "");
  687. if (keyValue.Value is JArray array)
  688. {
  689. int aa = 0;
  690. foreach (JValue obja in array)
  691. {
  692. parmeters.Add("@" + key + aa, obja);
  693. aa++;
  694. }
  695. }
  696. else if (keyValue.Value is IEnumerable enumerable && !(keyValue.Value is String))
  697. {
  698. int aa = 0;
  699. foreach (object obja in enumerable)
  700. {
  701. parmeters.Add("@" + key + aa, obja);
  702. aa++;
  703. }
  704. }
  705. else if (keyValue.Value is JsonElement jsonElement)
  706. {
  707. if (jsonElement.ValueKind is JsonValueKind.Array)
  708. {
  709. int aa = 0;
  710. foreach (JsonElement obja in jsonElement.EnumerateArray().ToArray())
  711. {
  712. if (obja.ValueKind is JsonValueKind.String)
  713. {
  714. parmeters.Add("@" + key + aa, obja.ToString());
  715. }
  716. if (obja.ValueKind is JsonValueKind.Number)
  717. {
  718. parmeters.Add("@" + key + aa, double.Parse(obja.ToString()));
  719. }
  720. if (obja.ValueKind is JsonValueKind.True)
  721. {
  722. parmeters.Add("@" + key + aa, bool.Parse(obja.ToString()));
  723. }
  724. if (obja.ValueKind is JsonValueKind.False)
  725. {
  726. parmeters.Add("@" + key + aa, bool.Parse(obja.ToString()));
  727. }
  728. aa++;
  729. }
  730. }
  731. else
  732. {
  733. if (jsonElement.ValueKind is JsonValueKind.String)
  734. {
  735. parmeters.Add("@" + key, keyValue.Value.ToString());
  736. }
  737. else if (jsonElement.ValueKind is JsonValueKind.Number)
  738. {
  739. parmeters.Add("@" + key, double.Parse(keyValue.Value.ToString()));
  740. }
  741. else if (jsonElement.ValueKind is JsonValueKind.True)
  742. {
  743. parmeters.Add("@" + key, bool.Parse(keyValue.Value.ToString()));
  744. }
  745. else if (jsonElement.ValueKind is JsonValueKind.False)
  746. {
  747. parmeters.Add("@" + key, bool.Parse(keyValue.Value.ToString()));
  748. }
  749. else
  750. {
  751. parmeters.Add("@" + key, keyValue.Value.ToString());
  752. }
  753. }
  754. }
  755. else
  756. {
  757. parmeters.Add("@" + key, keyValue.Value);
  758. }
  759. }
  760. if (offset != -1 && limit != 0)
  761. {
  762. parmeters.Add("@offsetNum", offset);
  763. parmeters.Add("@limitNum", limit);
  764. }
  765. return parmeters;
  766. }
  767. }
  768. }