ContextMethods.cs 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Data.Common;
  7. using System.Dynamic;
  8. using System.Linq;
  9. using System.Linq.Expressions;
  10. using System.Reflection;
  11. using System.Text;
  12. using System.Text.RegularExpressions;
  13. using System.Threading.Tasks;
  14. namespace SqlSugar
  15. {
  16. public partial class ContextMethods : IContextMethods
  17. {
  18. public SqlSugarProvider Context { get; set; }
  19. public QueryBuilder QueryBuilder { get; set; }
  20. #region DataReader
  21. public List<T> DataReaderToValueTupleType<T>(IDataReader reader)
  22. {
  23. var result = new List<T>();
  24. // Get the property names and types dynamically
  25. var propertyNames = Enumerable.Range(0, reader.FieldCount)
  26. .Select(reader.GetName).ToList();
  27. var propertyTypes = Enumerable.Range(0, reader.FieldCount)
  28. .Select(reader.GetFieldType).ToList();
  29. using (reader)
  30. {
  31. while (reader.Read())
  32. {
  33. // Create a new instance of the tuple type using the property types
  34. var tupleType = typeof(T);
  35. var tupleInstance = Activator.CreateInstance(tupleType);
  36. // Set the property values dynamically
  37. for (int i = 0; i < reader.FieldCount; i++)
  38. {
  39. var propertyName = propertyNames[i];
  40. var propertyValue = reader.GetValue(i);
  41. var propertyType = propertyTypes[i];
  42. var propertyInfo = tupleType.GetFields()[i];
  43. propertyInfo.SetValue(tupleInstance, UtilMethods.ChangeType2(propertyValue, propertyInfo.FieldType));
  44. }
  45. // Add the tuple instance to the result list
  46. result.Add((T)tupleInstance);
  47. }
  48. }
  49. return result;
  50. }
  51. public async Task<List<T>> DataReaderToValueTupleTypeAsync<T>(IDataReader reader)
  52. {
  53. var result = new List<T>();
  54. // Get the property names and types dynamically
  55. var propertyNames = Enumerable.Range(0, reader.FieldCount)
  56. .Select(reader.GetName).ToList();
  57. var propertyTypes = Enumerable.Range(0, reader.FieldCount)
  58. .Select(reader.GetFieldType).ToList();
  59. using (reader)
  60. {
  61. while ( await ((DbDataReader)reader).ReadAsync())
  62. {
  63. // Create a new instance of the tuple type using the property types
  64. var tupleType = typeof(T);
  65. var tupleInstance = Activator.CreateInstance(tupleType);
  66. // Set the property values dynamically
  67. for (int i = 0; i < reader.FieldCount; i++)
  68. {
  69. var propertyName = propertyNames[i];
  70. var propertyValue = reader.GetValue(i);
  71. var propertyType = propertyTypes[i];
  72. var propertyInfo = tupleType.GetFields()[i];
  73. propertyInfo.SetValue(tupleInstance, Convert.ChangeType(propertyValue, propertyType));
  74. }
  75. // Add the tuple instance to the result list
  76. result.Add((T)tupleInstance);
  77. }
  78. }
  79. return result;
  80. }
  81. /// <summary>
  82. ///DataReader to Dynamic
  83. /// </summary>
  84. /// <param name="reader"></param>
  85. /// <returns></returns>
  86. public ExpandoObject DataReaderToExpandoObject(IDataReader reader)
  87. {
  88. ExpandoObject result = new ExpandoObject();
  89. var dic = ((IDictionary<string, object>)result);
  90. for (int i = 0; i < reader.FieldCount; i++)
  91. {
  92. try
  93. {
  94. var addItem = reader.GetValue(i);
  95. if (addItem == DBNull.Value)
  96. addItem = null;
  97. dic.Add(reader.GetName(i), addItem);
  98. }
  99. catch
  100. {
  101. dic.Add(reader.GetName(i), null);
  102. }
  103. }
  104. return result;
  105. }
  106. /// <summary>
  107. ///DataReader to Dynamic List
  108. /// </summary>
  109. /// <param name="reader"></param>
  110. /// <returns></returns>
  111. public List<ExpandoObject> DataReaderToExpandoObjectList(IDataReader reader)
  112. {
  113. using (reader)
  114. {
  115. List<ExpandoObject> result = new List<ExpandoObject>();
  116. if (reader != null && !reader.IsClosed)
  117. {
  118. while (reader.Read())
  119. {
  120. result.Add(DataReaderToExpandoObject(reader));
  121. }
  122. }
  123. return result;
  124. }
  125. }
  126. /// <summary>
  127. ///DataReader to Dynamic List
  128. /// </summary>
  129. /// <param name="reader"></param>
  130. /// <returns></returns>
  131. public async Task<List<ExpandoObject>> DataReaderToExpandoObjectListAsync(IDataReader reader)
  132. {
  133. using (reader)
  134. {
  135. List<ExpandoObject> result = new List<ExpandoObject>();
  136. if (reader != null && !reader.IsClosed)
  137. {
  138. while (await ((DbDataReader)reader).ReadAsync())
  139. {
  140. result.Add(DataReaderToExpandoObject(reader));
  141. }
  142. }
  143. return result;
  144. }
  145. }
  146. /// <summary>
  147. ///DataReader to Dynamic List
  148. /// </summary>
  149. /// <param name="reader"></param>
  150. /// <returns></returns>
  151. public List<ExpandoObject> DataReaderToExpandoObjectListNoUsing(IDataReader reader)
  152. {
  153. List<ExpandoObject> result = new List<ExpandoObject>();
  154. if (reader != null && !reader.IsClosed)
  155. {
  156. while (reader.Read())
  157. {
  158. result.Add(DataReaderToExpandoObject(reader));
  159. }
  160. }
  161. return result;
  162. }
  163. /// <summary>
  164. ///DataReader to Dynamic List
  165. /// </summary>
  166. /// <param name="reader"></param>
  167. /// <returns></returns>
  168. public async Task<List<ExpandoObject>> DataReaderToExpandoObjectListAsyncNoUsing(IDataReader reader)
  169. {
  170. List<ExpandoObject> result = new List<ExpandoObject>();
  171. if (reader != null && !reader.IsClosed)
  172. {
  173. while (await ((DbDataReader)reader).ReadAsync())
  174. {
  175. result.Add(DataReaderToExpandoObject(reader));
  176. }
  177. }
  178. return result;
  179. }
  180. /// <summary>
  181. ///DataReader to DataReaderToDictionary
  182. /// </summary>
  183. /// <param name="reader"></param>
  184. /// <returns></returns>
  185. public Dictionary<string, object> DataReaderToDictionary(IDataReader reader)
  186. {
  187. Dictionary<string, object> result = new Dictionary<string, object>();
  188. for (int i = 0; i < reader.FieldCount; i++)
  189. {
  190. try
  191. {
  192. var addItem = reader.GetValue(i);
  193. if (addItem == DBNull.Value)
  194. addItem = null;
  195. result.Add(reader.GetName(i), addItem);
  196. }
  197. catch
  198. {
  199. result.Add(reader.GetName(i), null);
  200. }
  201. }
  202. return result;
  203. }
  204. /// <summary>
  205. ///DataReader to DataReaderToDictionary
  206. /// </summary>
  207. /// <param name="reader"></param>
  208. /// <returns></returns>
  209. public Dictionary<string, object> DataReaderToDictionary(IDataReader reader, Type type)
  210. {
  211. Dictionary<string, object> result = new Dictionary<string, object>();
  212. for (int i = 0; i < reader.FieldCount; i++)
  213. {
  214. string name = reader.GetName(i);
  215. try
  216. {
  217. name = this.Context.EntityMaintenance.GetPropertyName(name, type);
  218. var addItem = reader.GetValue(i);
  219. if (addItem == DBNull.Value)
  220. addItem = null;
  221. result.Add(name, addItem);
  222. }
  223. catch
  224. {
  225. if (!result.ContainsKey(name))
  226. {
  227. result.Add(name, null);
  228. }
  229. }
  230. }
  231. return result;
  232. }
  233. /// <summary>
  234. /// DataReaderToList
  235. /// </summary>
  236. /// <typeparam name="T"></typeparam>
  237. /// <param name="reader"></param>
  238. /// <returns></returns>
  239. public List<T> DataReaderToList<T>(IDataReader reader)
  240. {
  241. using (reader)
  242. {
  243. var tType = typeof(T);
  244. var classProperties = tType.GetProperties().ToList();
  245. var reval = new List<T>();
  246. if (reader != null && !reader.IsClosed)
  247. {
  248. while (reader.Read())
  249. {
  250. Dictionary<string, object> result = DataReaderToList(reader, tType, classProperties, reval);
  251. var stringValue = SerializeObject(result);
  252. reval.Add((T)DeserializeObject<T>(stringValue));
  253. SetAppendColumns(reader);
  254. }
  255. }
  256. return reval;
  257. }
  258. }
  259. public List<T> DataReaderToSelectJsonList<T>(IDataReader dataReader)
  260. {
  261. List<T> result = new List<T>();
  262. using (dataReader)
  263. {
  264. while (dataReader.Read())
  265. {
  266. var value = dataReader.GetValue(0);
  267. if (value == null || value == DBNull.Value)
  268. {
  269. result.Add(default(T));
  270. }
  271. else
  272. {
  273. result.Add(Context.Utilities.DeserializeObject<T>(value.ToString()));
  274. }
  275. }
  276. }
  277. return result;
  278. }
  279. public List<T> DataReaderToSelectArrayList<T>(IDataReader dataReader)
  280. {
  281. List<T> result = new List<T>();
  282. using (dataReader)
  283. {
  284. while (dataReader.Read())
  285. {
  286. var value = dataReader.GetValue(0);
  287. if (value == null || value == DBNull.Value)
  288. {
  289. result.Add(default(T));
  290. }
  291. else
  292. {
  293. result.Add((T)value);
  294. }
  295. }
  296. }
  297. return result;
  298. }
  299. /// <summary>
  300. /// DataReaderToList
  301. /// </summary>
  302. /// <typeparam name="T"></typeparam>
  303. /// <param name="reader"></param>
  304. /// <returns></returns>
  305. public List<T> DataReaderToListNoUsing<T>(IDataReader reader)
  306. {
  307. var tType = typeof(T);
  308. var classProperties = tType.GetProperties().ToList();
  309. var reval = new List<T>();
  310. if (reader != null && !reader.IsClosed)
  311. {
  312. while (reader.Read())
  313. {
  314. Dictionary<string, object> result = DataReaderToList(reader, tType, classProperties, reval);
  315. var stringValue = SerializeObject(result);
  316. reval.Add((T)DeserializeObject<T>(stringValue));
  317. }
  318. }
  319. return reval;
  320. }
  321. /// <summary>
  322. /// DataReaderToList
  323. /// </summary>
  324. /// <typeparam name="T"></typeparam>
  325. /// <param name="reader"></param>
  326. /// <returns></returns>
  327. public async Task<List<T>> DataReaderToListAsync<T>(IDataReader reader)
  328. {
  329. using (reader)
  330. {
  331. var tType = typeof(T);
  332. var classProperties = tType.GetProperties().ToList();
  333. var reval = new List<T>();
  334. if (reader != null && !reader.IsClosed)
  335. {
  336. while (await ((DbDataReader)reader).ReadAsync())
  337. {
  338. Dictionary<string, object> result = DataReaderToList(reader, tType, classProperties, reval);
  339. var stringValue = SerializeObject(result);
  340. reval.Add((T)DeserializeObject<T>(stringValue));
  341. SetAppendColumns(reader);
  342. }
  343. }
  344. return reval;
  345. }
  346. }
  347. public async Task<List<T>> DataReaderToSelectJsonListAsync<T>(IDataReader dataReader)
  348. {
  349. List<T> result = new List<T>();
  350. using (dataReader)
  351. {
  352. while (await ((DbDataReader)dataReader).ReadAsync())
  353. {
  354. var value = dataReader.GetValue(0);
  355. if (value == null || value == DBNull.Value)
  356. {
  357. result.Add(default(T));
  358. }
  359. else
  360. {
  361. result.Add(Context.Utilities.DeserializeObject<T>(value.ToString()));
  362. }
  363. }
  364. }
  365. return result;
  366. }
  367. public async Task<List<T>> DataReaderToSelectArrayListAsync<T>(IDataReader dataReader)
  368. {
  369. List<T> result = new List<T>();
  370. using (dataReader)
  371. {
  372. while (await ((DbDataReader)dataReader).ReadAsync())
  373. {
  374. var value = dataReader.GetValue(0);
  375. if (value == null || value == DBNull.Value)
  376. {
  377. result.Add(default(T));
  378. }
  379. else
  380. {
  381. result.Add((T)value);
  382. }
  383. }
  384. }
  385. return result;
  386. }
  387. /// <summary>
  388. /// DataReaderToList
  389. /// </summary>
  390. /// <typeparam name="T"></typeparam>
  391. /// <param name="reader"></param>
  392. /// <returns></returns>
  393. public async Task<List<T>> DataReaderToListAsyncNoUsing<T>(IDataReader reader)
  394. {
  395. var tType = typeof(T);
  396. var classProperties = tType.GetProperties().ToList();
  397. var reval = new List<T>();
  398. if (reader != null && !reader.IsClosed)
  399. {
  400. while (await ((DbDataReader)reader).ReadAsync())
  401. {
  402. Dictionary<string, object> result = DataReaderToList(reader, tType, classProperties, reval);
  403. var stringValue = SerializeObject(result);
  404. reval.Add((T)DeserializeObject<T>(stringValue));
  405. }
  406. }
  407. return reval;
  408. }
  409. private Dictionary<string, object> DataReaderToList<T>(IDataReader reader, Type tType, List<PropertyInfo> classProperties, List<T> reval)
  410. {
  411. var readerValues = DataReaderToDictionary(reader, tType);
  412. var mappingKeys = this.QueryBuilder?.MappingKeys;
  413. var result = new Dictionary<string, object>();
  414. foreach (var item in classProperties)
  415. {
  416. var name = item.Name;
  417. var typeName = tType.Name;
  418. if (item.PropertyType.IsClass())
  419. {
  420. if (item.PropertyType.FullName == "Newtonsoft.Json.Linq.JObject")
  421. {
  422. result.Add(name, DeserializeObject<dynamic>(readerValues[item.Name].ToString()));
  423. }
  424. else if (IsJsonItem(readerValues, name))
  425. {
  426. result.Add(name, DeserializeObject<Dictionary<string, object>>(readerValues.First(it => it.Key.EqualCase(name)).Value.ObjToString()));
  427. }
  428. else if (IsJsonList(readerValues, item))
  429. {
  430. var json = readerValues.First(y => y.Key.EqualCase(item.Name)).Value.ToString();
  431. result.Add(name, DeserializeObject<List<Dictionary<string, object>>>(json));
  432. }
  433. else if (IsBytes(readerValues, item))
  434. {
  435. result.Add(name, (byte[])readerValues[item.Name.ToLower()]);
  436. }
  437. else if (StaticConfig.EnableAot&& tType == typeof(DbColumnInfo) && item.PropertyType == typeof(object))
  438. {
  439. //No add
  440. }
  441. else if (item.PropertyType == typeof(object))
  442. {
  443. result.Add(name, readerValues[item.Name.ToLower()]);
  444. }
  445. else if (IsArrayItem(readerValues, item))
  446. {
  447. var json = readerValues.First(y => y.Key.EqualCase(item.Name)).Value + "";
  448. if (json.StartsWith("[{"))
  449. {
  450. result.Add(name, DeserializeObject<JArray>(json));
  451. }
  452. else
  453. {
  454. result.Add(name, DeserializeObject<string[]>(json));
  455. }
  456. }
  457. else if (StaticConfig.EnableAot && item.PropertyType == typeof(Type))
  458. {
  459. //No Add
  460. }
  461. else
  462. {
  463. result.Add(name, DataReaderToDynamicList_Part(readerValues, item, reval, mappingKeys));
  464. }
  465. }
  466. else
  467. {
  468. if (readerValues.Any(it => it.Key.Equals(name, StringComparison.CurrentCultureIgnoreCase)))
  469. {
  470. var addValue = readerValues.ContainsKey(name) ? readerValues[name] : readerValues.First(it => it.Key.Equals(name, StringComparison.CurrentCultureIgnoreCase)).Value;
  471. if (addValue!=null&&this.QueryBuilder?.QueryableFormats?.Any(it=>it.PropertyName==name)==true)
  472. {
  473. var valueFomatInfo = this.QueryBuilder?.QueryableFormats?.First(it => it.PropertyName == name);
  474. addValue =UtilMethods.GetFormatValue(addValue,valueFomatInfo);
  475. }
  476. var type = UtilMethods.GetUnderType(item.PropertyType);
  477. if (addValue == DBNull.Value || addValue == null)
  478. {
  479. if (item.PropertyType.IsIn(UtilConstants.IntType, UtilConstants.DecType, UtilConstants.DobType, UtilConstants.ByteType))
  480. {
  481. addValue = 0;
  482. }
  483. else if (item.PropertyType == UtilConstants.GuidType)
  484. {
  485. addValue = Guid.Empty;
  486. }
  487. else if (item.PropertyType == UtilConstants.DateType)
  488. {
  489. addValue = DateTime.MinValue;
  490. }
  491. else if (item.PropertyType == UtilConstants.StringType)
  492. {
  493. addValue = null;
  494. }
  495. else
  496. {
  497. addValue = null;
  498. }
  499. }
  500. else if (type == UtilConstants.IntType)
  501. {
  502. addValue = Convert.ToInt32(addValue);
  503. }
  504. else if (type == UtilConstants.LongType)
  505. {
  506. addValue = Convert.ToInt64(addValue);
  507. }
  508. else if (type.IsEnum() && addValue is decimal)
  509. {
  510. addValue = Convert.ToInt64(addValue);
  511. }
  512. else if (type.FullName == "System.DateOnly")
  513. {
  514. addValue = Convert.ToDateTime(addValue).ToString("yyyy-MM-dd");
  515. }
  516. result.Add(name, addValue);
  517. }
  518. }
  519. }
  520. return result;
  521. }
  522. private void SetAppendColumns(IDataReader dataReader)
  523. {
  524. if (QueryBuilder != null && QueryBuilder.AppendColumns != null && QueryBuilder.AppendColumns.Any())
  525. {
  526. if (QueryBuilder.AppendValues == null)
  527. QueryBuilder.AppendValues = new List<List<QueryableAppendColumn>>();
  528. List<QueryableAppendColumn> addItems = new List<QueryableAppendColumn>();
  529. foreach (var item in QueryBuilder.AppendColumns)
  530. {
  531. var vi = dataReader.GetOrdinal(item.AsName);
  532. var value = dataReader.GetValue(vi);
  533. addItems.Add(new QueryableAppendColumn()
  534. {
  535. Name = item.Name,
  536. AsName = item.AsName,
  537. Value = value
  538. });
  539. }
  540. QueryBuilder.AppendValues.Add(addItems);
  541. }
  542. if (QueryBuilder?.AppendNavInfo != null)
  543. {
  544. var navResult = new AppendNavResult();
  545. foreach (var item in QueryBuilder?.AppendNavInfo.AppendProperties)
  546. {
  547. var vi = dataReader.GetOrdinal("SugarNav_" + item.Key);
  548. var value = dataReader.GetValue(vi);
  549. navResult.result.Add("SugarNav_" + item.Key, value);
  550. }
  551. QueryBuilder?.AppendNavInfo.Result.Add(navResult);
  552. }
  553. }
  554. private static bool IsBytes(Dictionary<string, object> readerValues, PropertyInfo item)
  555. {
  556. return item.PropertyType == UtilConstants.ByteArrayType &&
  557. readerValues.ContainsKey(item.Name.ToLower()) &&
  558. (readerValues[item.Name.ToLower()] == null ||
  559. readerValues[item.Name.ToLower()].GetType() == UtilConstants.ByteArrayType);
  560. }
  561. private static bool IsJsonItem(Dictionary<string, object> readerValuesOld, string name)
  562. {
  563. Dictionary<string, object> readerValues = new Dictionary<string, object>();
  564. if (readerValuesOld.Any(it => it.Key.EqualCase(name)))
  565. {
  566. var data = readerValuesOld.First(it => it.Key.EqualCase(name));
  567. readerValues.Add(data.Key, data.Value);
  568. }
  569. return readerValues != null &&
  570. readerValues.Count == 1 &&
  571. readerValues.First().Key == name &&
  572. readerValues.First().Value != null &&
  573. readerValues.First().Value.GetType() == UtilConstants.StringType &&
  574. Regex.IsMatch(readerValues.First().Value.ObjToString(), @"^\{.+\}$");
  575. }
  576. private static bool IsArrayItem(Dictionary<string, object> readerValues, PropertyInfo item)
  577. {
  578. var isArray = item.PropertyType.IsArray && readerValues.Any(y => y.Key.EqualCase(item.Name)) && readerValues.FirstOrDefault(y => y.Key.EqualCase(item.Name)).Value is string;
  579. var isListItem = item.PropertyType.FullName.IsCollectionsList() &&
  580. item.PropertyType.GenericTypeArguments.Length == 1 &&
  581. item.PropertyType.GenericTypeArguments.First().IsClass() == false && readerValues.FirstOrDefault(y => y.Key.EqualCase(item.Name)).Value is string;
  582. return isArray || isListItem;
  583. }
  584. private static bool IsJsonList(Dictionary<string, object> readerValues, PropertyInfo item)
  585. {
  586. return item.PropertyType.FullName.IsCollectionsList() &&
  587. readerValues.Any(y => y.Key.EqualCase(item.Name)) &&
  588. readerValues.First(y => y.Key.EqualCase(item.Name)).Value != null &&
  589. readerValues.First(y => y.Key.EqualCase(item.Name)).Value.GetType() == UtilConstants.StringType &&
  590. Regex.IsMatch(readerValues.First(y => y.Key.EqualCase(item.Name)).Value.ToString(), @"^\[{.+\}]$");
  591. }
  592. private Dictionary<string, object> DataReaderToDynamicList_Part<T>(Dictionary<string, object> readerValues, PropertyInfo item, List<T> reval, Dictionary<string, string> mappingKeys = null)
  593. {
  594. Dictionary<string, object> result = new Dictionary<string, object>();
  595. var type = item.PropertyType;
  596. if (UtilConstants.SugarType == type)
  597. {
  598. return result;
  599. }
  600. if (type.FullName.IsCollectionsList())
  601. {
  602. return null;
  603. }
  604. if (type == typeof(string[]))
  605. {
  606. return null;
  607. }
  608. var classProperties = type.GetProperties().ToList();
  609. if (type.Name.StartsWith("Dictionary`"))
  610. {
  611. return null;
  612. }
  613. var columns = this.Context.EntityMaintenance.GetEntityInfo(type).Columns;
  614. foreach (var prop in classProperties)
  615. {
  616. var name = prop.Name;
  617. var typeName = type.Name;
  618. if (prop.PropertyType.IsClass())
  619. {
  620. var suagrColumn = prop.GetCustomAttribute<SugarColumn>();
  621. if (suagrColumn != null && suagrColumn.IsJson)
  622. {
  623. if (mappingKeys != null && mappingKeys.ContainsKey(item.Name))
  624. {
  625. var key = mappingKeys[item.Name];
  626. Json(readerValues, result, name, typeName, key);
  627. }
  628. else
  629. {
  630. Json(readerValues, result, name, typeName);
  631. }
  632. }
  633. else if (columns.Any(it => it.IsJson))
  634. {
  635. var column = columns.FirstOrDefault(it => it.PropertyName == name);
  636. if (column != null && column.IsJson)
  637. {
  638. Json(readerValues, result, name, typeName);
  639. }
  640. }
  641. else
  642. {
  643. result.Add(name, DataReaderToDynamicList_Part(readerValues, prop, reval));
  644. }
  645. }
  646. else
  647. {
  648. var key = typeName + "." + name;
  649. var info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower());
  650. if (info == null)
  651. {
  652. key = item.Name + "." + name;
  653. info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower());
  654. if (info == null)
  655. {
  656. info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower().EndsWith("."+ key.ToLower()));
  657. }
  658. }
  659. var oldInfo = info;
  660. if (mappingKeys != null && mappingKeys.ContainsKey(item.Name))
  661. {
  662. key = mappingKeys[item.Name] + "." + typeName + "." + name;
  663. info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower());
  664. if (info == null)
  665. {
  666. var key2 = item.Name + "." + name;
  667. info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key2.ToLower());
  668. }
  669. }
  670. else if (mappingKeys != null && mappingKeys.ContainsKey("Single_" + name))
  671. {
  672. key = mappingKeys["Single_" + name];
  673. info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower());
  674. }
  675. if (info == null && oldInfo != null)
  676. {
  677. info = oldInfo;
  678. }
  679. if (info != null)
  680. {
  681. var addItem = readerValues[info];
  682. if (addItem == DBNull.Value)
  683. addItem = null;
  684. if (prop.PropertyType == UtilConstants.IntType)
  685. {
  686. addItem = addItem.ObjToInt();
  687. }
  688. else if (prop.PropertyType == UtilConstants.ShortType)
  689. {
  690. addItem = Convert.ToInt16(addItem);
  691. }
  692. else if (prop.PropertyType == UtilConstants.LongType)
  693. {
  694. addItem = Convert.ToInt64(addItem);
  695. }
  696. else if (UtilMethods.GetUnderType(prop.PropertyType) == UtilConstants.IntType && addItem != null)
  697. {
  698. addItem = addItem.ObjToInt();
  699. }
  700. else if (UtilMethods.GetUnderType(prop.PropertyType).IsEnum() && addItem is decimal)
  701. {
  702. if (prop.PropertyType.IsEnum() == false && addItem == null)
  703. {
  704. //Future
  705. }
  706. else
  707. {
  708. addItem = Convert.ToInt64(addItem);
  709. }
  710. }
  711. result.Add(name, addItem);
  712. }
  713. }
  714. }
  715. return result;
  716. }
  717. private void Json(Dictionary<string, object> readerValues, Dictionary<string, object> result, string name, string typeName, string shortName = null)
  718. {
  719. var key = (typeName + "." + name).ToLower();
  720. if (readerValues.Any(it => it.Key.EqualCase(key)))
  721. {
  722. var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
  723. AddJson(result, name, jsonString);
  724. }
  725. else
  726. {
  727. key = (shortName + "." + typeName + "." + name).ToLower();
  728. if (readerValues.Any(it => it.Key.EqualCase(key)))
  729. {
  730. var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
  731. AddJson(result, name, jsonString);
  732. }
  733. }
  734. }
  735. private void AddJson(Dictionary<string, object> result, string name, object jsonString)
  736. {
  737. if (jsonString != null)
  738. {
  739. if (jsonString.ToString().First() == '{' && jsonString.ToString().Last() == '}')
  740. {
  741. result.Add(name, this.DeserializeObject<Dictionary<string, object>>(jsonString + ""));
  742. }
  743. else if (jsonString.ToString().Replace(" ", "") != "[]" && !jsonString.ToString().Contains("{") && !jsonString.ToString().Contains("}"))
  744. {
  745. result.Add(name, this.DeserializeObject<dynamic>(jsonString + ""));
  746. }
  747. else
  748. {
  749. result.Add(name, this.DeserializeObject<List<Dictionary<string, object>>>(jsonString + ""));
  750. }
  751. }
  752. }
  753. #endregion
  754. #region Serialize
  755. /// <summary>
  756. /// Serialize Object
  757. /// </summary>
  758. /// <param name="value"></param>
  759. /// <returns></returns>
  760. public string SerializeObject(object value)
  761. {
  762. DependencyManagement.TryJsonNet();
  763. return Context.CurrentConnectionConfig.ConfigureExternalServices.SerializeService.SerializeObject(value);
  764. }
  765. public string SerializeObject(object value, Type type)
  766. {
  767. DependencyManagement.TryJsonNet();
  768. if (type.IsAnonymousType())
  769. {
  770. return Context.CurrentConnectionConfig.ConfigureExternalServices.SerializeService.SerializeObject(value);
  771. }
  772. else
  773. {
  774. var isSugar = this.Context.EntityMaintenance.GetEntityInfo(type).Columns.Any(it => it.NoSerialize || it.SerializeDateTimeFormat.HasValue());
  775. if (isSugar)
  776. {
  777. return Context.CurrentConnectionConfig.ConfigureExternalServices.SerializeService.SugarSerializeObject(value);
  778. }
  779. else
  780. {
  781. return Context.CurrentConnectionConfig.ConfigureExternalServices.SerializeService.SerializeObject(value);
  782. }
  783. }
  784. }
  785. /// <summary>
  786. /// Serialize Object
  787. /// </summary>
  788. /// <param name="value"></param>
  789. /// <returns></returns>
  790. public T DeserializeObject<T>(string value)
  791. {
  792. DependencyManagement.TryJsonNet();
  793. return Context.CurrentConnectionConfig.ConfigureExternalServices.SerializeService.DeserializeObject<T>(value);
  794. }
  795. #endregion
  796. #region Copy Object
  797. /// <summary>
  798. /// Copy new Object
  799. /// </summary>
  800. /// <typeparam name="T"></typeparam>
  801. /// <param name="sourceObject"></param>
  802. /// <returns></returns>
  803. public T TranslateCopy<T>(T sourceObject)
  804. {
  805. if (sourceObject == null) return default(T);
  806. else
  807. {
  808. var jsonString = SerializeObject(sourceObject);
  809. return DeserializeObject<T>(jsonString);
  810. }
  811. }
  812. public SqlSugarProvider CopyContext(bool isCopyEvents = false)
  813. {
  814. var newClient = new SqlSugarProvider(this.TranslateCopy(Context.CurrentConnectionConfig));
  815. newClient.CurrentConnectionConfig.ConfigureExternalServices = Context.CurrentConnectionConfig.ConfigureExternalServices;
  816. newClient.MappingColumns = this.TranslateCopy(Context.MappingColumns);
  817. newClient.MappingTables = this.TranslateCopy(Context.MappingTables);
  818. newClient.IgnoreColumns = this.TranslateCopy(Context.IgnoreColumns);
  819. newClient.IgnoreInsertColumns = this.TranslateCopy(Context.IgnoreInsertColumns);
  820. if (isCopyEvents)
  821. {
  822. newClient.QueryFilter = Context.QueryFilter;
  823. newClient.CurrentConnectionConfig.AopEvents = Context.CurrentConnectionConfig.AopEvents;
  824. }
  825. return newClient;
  826. }
  827. #endregion
  828. #region DataTable
  829. public DataTable DictionaryListToDataTable(List<Dictionary<string, object>> list)
  830. {
  831. DataTable result = new DataTable();
  832. if (list.Count == 0)
  833. return result;
  834. var columnNames = list.First();
  835. foreach (var item in columnNames)
  836. {
  837. result.Columns.Add(item.Key, item.Value == null ? typeof(object) : item.Value.GetType());
  838. }
  839. foreach (var item in list)
  840. {
  841. var row = result.NewRow();
  842. foreach (var key in item.Keys)
  843. {
  844. if (item[key] == null)
  845. {
  846. row[key] = DBNull.Value;
  847. }
  848. else
  849. {
  850. row[key] = item[key];
  851. }
  852. }
  853. result.Rows.Add(row);
  854. }
  855. return result;
  856. }
  857. public dynamic DataTableToDynamic(DataTable table)
  858. {
  859. List<Dictionary<string, object>> deserializeObject = new List<Dictionary<string, object>>();
  860. Dictionary<string, object> childRow;
  861. foreach (DataRow row in table.Rows)
  862. {
  863. childRow = new Dictionary<string, object>();
  864. foreach (DataColumn col in table.Columns)
  865. {
  866. var addItem = row[col];
  867. if (addItem == DBNull.Value)
  868. addItem = null;
  869. childRow.Add(col.ColumnName, addItem);
  870. }
  871. deserializeObject.Add(childRow);
  872. }
  873. return this.DeserializeObject<dynamic>(this.SerializeObject(deserializeObject));
  874. }
  875. public List<T> DataTableToList<T>(DataTable table)
  876. {
  877. List<Dictionary<string, object>> deserializeObject = new List<Dictionary<string, object>>();
  878. Dictionary<string, object> childRow;
  879. foreach (DataRow row in table.Rows)
  880. {
  881. childRow = new Dictionary<string, object>();
  882. foreach (DataColumn col in table.Columns)
  883. {
  884. var addItem = row[col];
  885. if (addItem == DBNull.Value)
  886. addItem = null;
  887. childRow.Add(col.ColumnName, addItem);
  888. }
  889. deserializeObject.Add(childRow);
  890. }
  891. return this.DeserializeObject<List<T>>(this.SerializeObject(deserializeObject));
  892. }
  893. public DataTable ListToDataTable<T>(List<T> list)
  894. {
  895. DataTable result = new DataTable();
  896. if (list != null && list.Count > 0)
  897. {
  898. PropertyInfo[] propertys = list[0].GetType().GetProperties();
  899. foreach (PropertyInfo pi in propertys)
  900. {
  901. //获取类型
  902. Type colType = pi.PropertyType;
  903. //当类型为Nullable<>时
  904. if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
  905. {
  906. colType = colType.GetGenericArguments()[0];
  907. }
  908. result.Columns.Add(pi.Name, colType);
  909. }
  910. for (int i = 0; i < list.Count; i++)
  911. {
  912. ArrayList tempList = new ArrayList();
  913. foreach (PropertyInfo pi in propertys)
  914. {
  915. object obj = pi.GetValue(list[i], null);
  916. tempList.Add(obj);
  917. }
  918. object[] array = tempList.ToArray();
  919. result.LoadDataRow(array, true);
  920. }
  921. }
  922. return result;
  923. }
  924. public DataTable ListToDataTableWithAttr<T>(List<T> list)
  925. {
  926. var entityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>();
  927. DataTable result = new DataTable();
  928. result.TableName = entityInfo.DbTableName;
  929. if (list != null && list.Count > 0)
  930. {
  931. var colimnInfos = entityInfo.Columns.Where(it => it.IsIgnore == false);
  932. foreach (var pi in colimnInfos)
  933. {
  934. //获取类型
  935. Type colType = pi.PropertyInfo.PropertyType;
  936. //当类型为Nullable<>时
  937. if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
  938. {
  939. colType = colType.GetGenericArguments()[0];
  940. }
  941. result.Columns.Add(pi.DbColumnName, colType);
  942. }
  943. for (int i = 0; i < list.Count; i++)
  944. {
  945. ArrayList tempList = new ArrayList();
  946. foreach (var pi in colimnInfos)
  947. {
  948. object obj = pi.PropertyInfo.GetValue(list[i], null);
  949. tempList.Add(obj);
  950. }
  951. object[] array = tempList.ToArray();
  952. result.LoadDataRow(array, true);
  953. }
  954. }
  955. return result;
  956. }
  957. public Dictionary<string, object> DataTableToDictionary(DataTable table)
  958. {
  959. return table.Rows.Cast<DataRow>().ToDictionary(x => x[0].ToString(), x => x[1]);
  960. }
  961. public List<Dictionary<string, object>> DataTableToDictionaryList(DataTable dt)
  962. {
  963. List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
  964. if (dt != null && dt.Rows.Count > 0)
  965. {
  966. foreach (DataRow dr in dt.Rows)
  967. {
  968. Dictionary<string, object> dic = new Dictionary<string, object>();
  969. for (int i = 0; i < dr.Table.Columns.Count; i++)
  970. {
  971. var value = dr[dr.Table.Columns[i].ColumnName];
  972. if (value == DBNull.Value)
  973. {
  974. value = null;
  975. }
  976. dic.Add(dr.Table.Columns[i].ColumnName.ToString(), value);
  977. }
  978. result.Add(dic);
  979. }
  980. }
  981. return result;
  982. }
  983. #endregion
  984. #region Cache
  985. public ICacheService GetReflectionInoCacheInstance()
  986. {
  987. return Context.CurrentConnectionConfig.ConfigureExternalServices.ReflectionInoCacheService;
  988. }
  989. public void RemoveCacheAll()
  990. {
  991. ReflectionInoHelper.RemoveAllCache();
  992. InstanceFactory.RemoveCache();
  993. }
  994. public void RemoveCacheAll<T>()
  995. {
  996. ReflectionInoCore<T>.GetInstance().RemoveAllCache();
  997. }
  998. public void RemoveCache<T>(string key)
  999. {
  1000. ReflectionInoCore<T>.GetInstance().Remove(key);
  1001. }
  1002. public void RemoveCacheByLikeKey<T>(string key)
  1003. {
  1004. foreach (var item in ReflectionInoCore<T>.GetInstance().GetAllKey())
  1005. {
  1006. if (item!=null&&key!=null&&item.Contains(key))
  1007. {
  1008. ReflectionInoCore<T>.GetInstance().Remove(item);
  1009. }
  1010. }
  1011. }
  1012. #endregion
  1013. #region Page Each
  1014. public void PageEach<T>(IEnumerable<T> pageItems, int pageSize, Action<List<T>> action)
  1015. {
  1016. if (pageItems != null && pageItems.Any())
  1017. {
  1018. int totalRecord = pageItems.Count();
  1019. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  1020. for (int i = 1; i <= pageCount; i++)
  1021. {
  1022. var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList();
  1023. action(list);
  1024. }
  1025. }
  1026. }
  1027. public async Task PageEachAsync<T>(IEnumerable<T> pageItems, int pageSize, Func<List<T>, Task> action)
  1028. {
  1029. if (pageItems != null && pageItems.Any())
  1030. {
  1031. int totalRecord = pageItems.Count();
  1032. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  1033. for (int i = 1; i <= pageCount; i++)
  1034. {
  1035. var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList();
  1036. await action(list);
  1037. }
  1038. }
  1039. }
  1040. public async Task PageEachAsync<T, ResultType>(IEnumerable<T> pageItems, int pageSize, Func<List<T>, Task<ResultType>> action)
  1041. {
  1042. if (pageItems != null && pageItems.Any())
  1043. {
  1044. int totalRecord = pageItems.Count();
  1045. int pageCount = (totalRecord + pageSize - 1) / pageSize;
  1046. for (int i = 1; i <= pageCount; i++)
  1047. {
  1048. var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList();
  1049. await action(list);
  1050. }
  1051. }
  1052. }
  1053. #endregion
  1054. #region Conditional
  1055. public List<IConditionalModel> JsonToConditionalModels(string json)
  1056. {
  1057. List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
  1058. var jarray = this.Context.Utilities.DeserializeObject<JArray>(json);
  1059. foreach (var item in jarray)
  1060. {
  1061. if (item.Count() > 0)
  1062. {
  1063. if (item.ToString().Contains("ConditionalList"))
  1064. {
  1065. IConditionalModel model = new ConditionalTree()
  1066. {
  1067. ConditionalList = GetConditionalList(item)
  1068. };
  1069. conditionalModels.Add(model);
  1070. }
  1071. else
  1072. {
  1073. var typeValue = item["ConditionalType"].Value<string>();
  1074. ConditionalModel conditionalModel = new ConditionalModel()
  1075. {
  1076. // ConditionalType = (ConditionalType)Convert.ToInt32(),
  1077. FieldName = item["FieldName"] + "",
  1078. CSharpTypeName = item["CSharpTypeName"].ObjToString().IsNullOrEmpty() ? null : item["CSharpTypeName"].ObjToString(),
  1079. FieldValue = item["FieldValue"].Value<string>() == null ? null : item["FieldValue"].ToString()
  1080. };
  1081. if (typeValue.IsInt())
  1082. {
  1083. conditionalModel.ConditionalType = (ConditionalType)Convert.ToInt32(typeValue);
  1084. }
  1085. else
  1086. {
  1087. conditionalModel.ConditionalType = (ConditionalType)Enum.Parse(typeof(ConditionalType), typeValue.ObjToString());
  1088. }
  1089. conditionalModels.Add(conditionalModel);
  1090. }
  1091. }
  1092. }
  1093. return conditionalModels;
  1094. }
  1095. private static List<KeyValuePair<WhereType, IConditionalModel>> GetConditionalList(JToken item)
  1096. {
  1097. List<KeyValuePair<WhereType, IConditionalModel>> result = new List<KeyValuePair<WhereType, IConditionalModel>>();
  1098. var values = item.Values().First();
  1099. foreach (var jToken in values)
  1100. {
  1101. WhereType type = (WhereType)Convert.ToInt32(jToken["Key"].Value<int>());
  1102. IConditionalModel conditionalModel = null;
  1103. var value = jToken["Value"];
  1104. if (value.ToString().Contains("ConditionalList"))
  1105. {
  1106. conditionalModel = new ConditionalTree()
  1107. {
  1108. ConditionalList = GetConditionalList(value)
  1109. };
  1110. }
  1111. else
  1112. {
  1113. conditionalModel = new ConditionalModel()
  1114. {
  1115. ConditionalType = GetConditionalType(value),
  1116. FieldName = value["FieldName"] + "",
  1117. CSharpTypeName = value["CSharpTypeName"].ObjToString().IsNullOrEmpty() ? null : value["CSharpTypeName"].ObjToString(),
  1118. FieldValue = value["FieldValue"].Value<string>() == null ? null : value["FieldValue"].ToString()
  1119. };
  1120. }
  1121. result.Add(new KeyValuePair<WhereType, IConditionalModel>(type, conditionalModel));
  1122. }
  1123. return result;
  1124. }
  1125. private static ConditionalType GetConditionalType(JToken value)
  1126. {
  1127. if (value["ConditionalType"].Type == JTokenType.String)
  1128. {
  1129. var stringValue = value["ConditionalType"].Value<string>();
  1130. if (!stringValue.IsInt())
  1131. {
  1132. return (ConditionalType)Enum.Parse(typeof(ConditionalType), stringValue);
  1133. }
  1134. }
  1135. return (ConditionalType)Convert.ToInt32(value["ConditionalType"].Value<int>());
  1136. }
  1137. #endregion
  1138. #region Tree
  1139. public List<T> ToTree<T>(List<T> list, Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, Expression<Func<T, object>> pkExpression, object rootValue)
  1140. {
  1141. var pk = ExpressionTool.GetMemberName(pkExpression);
  1142. return (this.Context.Queryable<T>() as QueryableProvider<T>).GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue);
  1143. }
  1144. #endregion
  1145. }
  1146. }