SQLHelper.cs 34 KB

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