SQLHelperParametric.cs 30 KB

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