SQLHelperParametric.cs 34 KB

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