Private.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. public partial class FastestProvider<T> : IFastest<T> where T : class, new()
  11. {
  12. private IFastBuilder GetBuider()
  13. {
  14. switch (this.context.CurrentConnectionConfig.DbType)
  15. {
  16. case DbType.MySql:
  17. var result= new MySqlFastBuilder();
  18. result.CharacterSet = this.CharacterSet;
  19. return result;
  20. case DbType.SqlServer:
  21. var result2= new SqlServerFastBuilder();
  22. result2.DbFastestProperties.IsOffIdentity = this.IsOffIdentity;
  23. return result2;
  24. case DbType.Sqlite:
  25. return new SqliteFastBuilder(this.entityInfo);
  26. case DbType.Oracle:
  27. return new OracleFastBuilder(this.entityInfo);
  28. case DbType.PostgreSQL:
  29. return new PostgreSQLFastBuilder(this.entityInfo);
  30. case DbType.MySqlConnector:
  31. var resultConnector = InstanceFactory.CreateInstance<IFastBuilder>("SqlSugar.MySqlConnector.MySqlFastBuilder");
  32. resultConnector.CharacterSet = this.CharacterSet;
  33. return resultConnector;
  34. case DbType.Dm:
  35. var result3= new DmFastBuilder();
  36. result3.DbFastestProperties.IsOffIdentity = this.IsOffIdentity;
  37. return result3;
  38. case DbType.ClickHouse:
  39. var resultConnectorClickHouse = InstanceFactory.CreateInstance<IFastBuilder>("SqlSugar.ClickHouse.ClickHouseFastBuilder");
  40. resultConnectorClickHouse.CharacterSet = this.CharacterSet;
  41. return resultConnectorClickHouse;
  42. case DbType.Kdbndp:
  43. break;
  44. case DbType.Oscar:
  45. break;
  46. default:
  47. break;
  48. }
  49. var reslut = InstanceFactory.CreateInstance<IFastBuilder>($"SqlSugar.{this.context.CurrentConnectionConfig.DbType}FastBuilder");
  50. reslut.CharacterSet = this.CharacterSet;
  51. reslut.FastEntityInfo = this.entityInfo;
  52. return reslut;
  53. }
  54. private DataTable ToDdateTable(List<T> datas)
  55. {
  56. var builder = GetBuider();
  57. DataTable tempDataTable = ReflectionInoCore<DataTable>.GetInstance().GetOrCreate("BulkCopyAsync" + typeof(T).GetHashCode(),
  58. () =>
  59. {
  60. if (AsName == null)
  61. {
  62. return queryable.Where(it => false).Select("*").ToDataTable();
  63. }
  64. else
  65. {
  66. return queryable.AS(AsName).Where(it => false).Select("*").ToDataTable();
  67. }
  68. }
  69. );
  70. var dt = new DataTable();
  71. List<string> uInt64TypeName = new List<string>();
  72. foreach (DataColumn item in tempDataTable.Columns)
  73. {
  74. if (item.DataType == typeof(UInt64))
  75. {
  76. uInt64TypeName.Add(item.ColumnName);
  77. }
  78. if (item.DataType.Name == "ClickHouseDecimal")
  79. {
  80. dt.Columns.Add(item.ColumnName, typeof(decimal));
  81. }
  82. else
  83. {
  84. dt.Columns.Add(item.ColumnName, item.DataType);
  85. }
  86. }
  87. dt.TableName = GetTableName();
  88. var columns = entityInfo.Columns;
  89. var isMySql = this.context.CurrentConnectionConfig.DbType.IsIn(DbType.MySql, DbType.MySqlConnector);
  90. var isSqliteCore = SugarCompatible.IsFramework==false&& this.context.CurrentConnectionConfig.DbType.IsIn(DbType.Sqlite);
  91. foreach (var item in datas)
  92. {
  93. var dr = dt.NewRow();
  94. foreach (var column in columns)
  95. {
  96. if (column.IsIgnore)
  97. {
  98. continue;
  99. }
  100. var name = column.DbColumnName;
  101. if (name == null)
  102. {
  103. name = column.PropertyName;
  104. }
  105. var value = ValueConverter(column, GetValue(item,column));
  106. if (column.SqlParameterDbType != null&& column.SqlParameterDbType is Type && UtilMethods.HasInterface((Type)column.SqlParameterDbType, typeof(ISugarDataConverter)))
  107. {
  108. var columnInfo = column;
  109. var type = columnInfo.SqlParameterDbType as Type;
  110. var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType);
  111. var obj = Activator.CreateInstance(type);
  112. var p = ParameterConverter.Invoke(obj, new object[] { value, 100 }) as SugarParameter;
  113. value = p.Value;
  114. }
  115. else if (isMySql && column.UnderType == UtilConstants.BoolType)
  116. {
  117. if (value.ObjToBool() == false&& uInt64TypeName.Any(z=>z.EqualCase(column.DbColumnName)))
  118. {
  119. value = DBNull.Value;
  120. }
  121. }
  122. else if (isSqliteCore&&column.UnderType == UtilConstants.StringType && value is bool)
  123. {
  124. value = "isSqliteCore_"+value.ObjToString();
  125. }
  126. else if (isSqliteCore && column.UnderType == UtilConstants.BoolType && value is bool)
  127. {
  128. value =Convert.ToBoolean(value)?1:0;
  129. }
  130. else if (column.UnderType == UtilConstants.DateTimeOffsetType && value != null && value != DBNull.Value)
  131. {
  132. if (builder.DbFastestProperties != null && builder.DbFastestProperties.HasOffsetTime == true)
  133. {
  134. //Don't need to deal with
  135. }
  136. else
  137. {
  138. value = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)value);
  139. }
  140. }
  141. else if (value != null && column.UnderType?.FullName == "System.TimeOnly")
  142. {
  143. value = UtilMethods.TimeOnlyToTimeSpan(value);
  144. }
  145. else if (value != null && column.UnderType?.FullName == "System.DateOnly")
  146. {
  147. value = UtilMethods.DateOnlyToDateTime(value);
  148. }
  149. dr[name] = value;
  150. }
  151. dt.Rows.Add(dr);
  152. }
  153. return dt;
  154. }
  155. private static object GetValue(T item, EntityColumnInfo column)
  156. {
  157. if (StaticConfig.EnableAot)
  158. {
  159. return column.PropertyInfo.GetValue(item);
  160. }
  161. else
  162. {
  163. return PropertyCallAdapterProvider<T>.GetInstance(column.PropertyName).InvokeGet(item);
  164. }
  165. }
  166. private string GetTableName()
  167. {
  168. if (this.AsName.HasValue())
  169. {
  170. return queryable.SqlBuilder.GetTranslationTableName(AsName);
  171. }
  172. else
  173. {
  174. return queryable.SqlBuilder.GetTranslationTableName(this.context.EntityMaintenance.GetTableName<T>());
  175. }
  176. }
  177. private object ValueConverter(EntityColumnInfo columnInfo, object value)
  178. {
  179. if (value == null)
  180. return DBNull.Value;
  181. if (value is DateTime && (DateTime)value == DateTime.MinValue)
  182. {
  183. value = Convert.ToDateTime("1900-01-01");
  184. }
  185. //else if (columnInfo.IsJson)
  186. //{
  187. // columnInfo.IsJson = true;
  188. //}
  189. //else if (columnInfo.IsArray)
  190. //{
  191. // columnInfo.IsArray = true;
  192. //}
  193. else if (columnInfo.UnderType.IsEnum() )
  194. {
  195. value = Convert.ToInt64(value);
  196. }
  197. else if (columnInfo.IsJson && value != null)
  198. {
  199. value = this.context.Utilities.SerializeObject(value);
  200. }
  201. else if (columnInfo.IsTranscoding && value.HasValue())
  202. {
  203. value = UtilMethods.EncodeBase64(value.ToString());
  204. }
  205. return value;
  206. }
  207. private DataTable GetCopyWriteDataTable(DataTable dt)
  208. {
  209. DataTable tempDataTable = null;
  210. if (AsName == null)
  211. {
  212. tempDataTable=queryable.Clone().Where(it => false).Select("*").ToDataTable();
  213. }
  214. else
  215. {
  216. tempDataTable=queryable.Clone().AS(AsName).Where(it => false).Select("*").ToDataTable();
  217. };
  218. List<string> uInt64TypeName = new List<string>();
  219. foreach (DataColumn item in tempDataTable.Columns)
  220. {
  221. if (item.DataType == typeof(UInt64))
  222. {
  223. uInt64TypeName.Add(item.ColumnName);
  224. }
  225. }
  226. var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).ToList();
  227. var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName.ToLower())).ToList();
  228. foreach (DataRow item in dt.Rows)
  229. {
  230. DataRow dr = tempDataTable.NewRow();
  231. foreach (DataColumn column in columns)
  232. {
  233. dr[column.ColumnName] = item[column.ColumnName];
  234. if (dr[column.ColumnName] == null|| dr[column.ColumnName] == DBNull.Value)
  235. {
  236. dr[column.ColumnName] = DBNull.Value;
  237. }
  238. else if(column.DataType==UtilConstants.BoolType&&this.context.CurrentConnectionConfig.DbType.IsIn(DbType.MySql, DbType.MySqlConnector))
  239. {
  240. if (Convert.ToBoolean(dr[column.ColumnName]) == false&&uInt64TypeName.Any(z => z.EqualCase(column.ColumnName)))
  241. {
  242. dr[column.ColumnName] = DBNull.Value;
  243. }
  244. }
  245. }
  246. tempDataTable.Rows.Add(dr);
  247. }
  248. tempDataTable.TableName = dt.TableName;
  249. return tempDataTable;
  250. }
  251. private DataTable GetCopyWriteDataTableUpdate(DataTable dt)
  252. {
  253. var sqlBuilder = this.context.Queryable<object>().SqlBuilder;
  254. var dts = dt.Columns.Cast<DataColumn>().Select(it => sqlBuilder.GetTranslationColumnName(it.ColumnName)).ToList();
  255. DataTable tempDataTable = null;
  256. if (AsName == null)
  257. {
  258. tempDataTable = queryable.Where(it => false).Select(string.Join(",", dts)).ToDataTable();
  259. }
  260. else
  261. {
  262. tempDataTable = queryable.AS(AsName).Where(it => false).Select(string.Join(",", dts)).ToDataTable();
  263. };
  264. List<string> uInt64TypeName = new List<string>();
  265. foreach (DataColumn item in tempDataTable.Columns)
  266. {
  267. if (item.DataType == typeof(UInt64))
  268. {
  269. uInt64TypeName.Add(item.ColumnName);
  270. }
  271. }
  272. var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).ToList();
  273. var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName.ToLower())).ToList();
  274. foreach (DataRow item in dt.Rows)
  275. {
  276. DataRow dr = tempDataTable.NewRow();
  277. foreach (DataColumn column in columns)
  278. {
  279. dr[column.ColumnName] = item[column.ColumnName];
  280. if (dr[column.ColumnName] == null || dr[column.ColumnName] == DBNull.Value)
  281. {
  282. dr[column.ColumnName] = DBNull.Value;
  283. }
  284. else if (column.DataType == UtilConstants.BoolType && this.context.CurrentConnectionConfig.DbType.IsIn(DbType.MySql, DbType.MySqlConnector))
  285. {
  286. if (Convert.ToBoolean(dr[column.ColumnName]) == false && uInt64TypeName.Any(z => z.EqualCase(column.ColumnName)))
  287. {
  288. dr[column.ColumnName] = DBNull.Value;
  289. }
  290. }
  291. }
  292. tempDataTable.Rows.Add(dr);
  293. }
  294. tempDataTable.TableName = dt.TableName;
  295. return tempDataTable;
  296. }
  297. private void RemoveCache()
  298. {
  299. if (!string.IsNullOrEmpty(CacheKey) || !string.IsNullOrEmpty(CacheKeyLike))
  300. {
  301. Check.Exception(this.context.CurrentConnectionConfig.ConfigureExternalServices?.DataInfoCacheService == null, "ConnectionConfig.ConfigureExternalServices.DataInfoCacheService is null");
  302. var service = this.context.CurrentConnectionConfig.ConfigureExternalServices?.DataInfoCacheService;
  303. if (!string.IsNullOrEmpty(CacheKey))
  304. {
  305. CacheSchemeMain.RemoveCache(service, CacheKey);
  306. }
  307. if (!string.IsNullOrEmpty(CacheKeyLike))
  308. {
  309. CacheSchemeMain.RemoveCacheByLike(service, CacheKeyLike);
  310. }
  311. }
  312. if (this.context.CurrentConnectionConfig?.MoreSettings?.IsAutoRemoveDataCache == true)
  313. {
  314. var cacheService = this.context.CurrentConnectionConfig?.ConfigureExternalServices?.DataInfoCacheService;
  315. if (cacheService != null)
  316. {
  317. CacheSchemeMain.RemoveCache(cacheService, this.context.EntityMaintenance.GetTableName<T>());
  318. }
  319. }
  320. }
  321. }
  322. }