IStorageable.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. public interface IStorageable<T> where T : class, new()
  11. {
  12. IStorageable<T> TableDataRange(Expression<Func<T, bool>> exp);
  13. IStorageable<T> WhereColumns(Expression<Func<T, object>> columns);
  14. IStorageable<T> WhereColumns(Expression<Func<T, object>> columns,Func<DateTime,string> formatTime);
  15. IStorageable<T> WhereColumns(string [] columns);
  16. IStorageable<T> WhereColumns(string[] columns, Func<DateTime, string> formatTime);
  17. IStorageable<T> SplitInsert(Func<StorageableInfo<T>, bool> conditions, string message=null);
  18. IStorageable<T> SplitUpdate(Func<StorageableInfo<T>, bool> conditions, string message = null);
  19. IStorageable<T> Saveable(string inserMessage = null, string updateMessage = null);
  20. IStorageable<T> SplitError(Func<StorageableInfo<T>, bool> conditions, string message = null);
  21. IStorageable<T> SplitIgnore(Func<StorageableInfo<T>, bool> conditions, string message = null);
  22. IStorageable<T> DisableFilters();
  23. IStorageable<T> TranLock(DbLockType LockType = DbLockType.Wait);
  24. IStorageable<T> TranLock(DbLockType? LockType);
  25. IStorageable<T> SplitDelete(Func<StorageableInfo<T>, bool> conditions, string message = null);
  26. IStorageable<T> SplitOther(Func<StorageableInfo<T>, bool> conditions, string message = null);
  27. StorageableResult<T> ToStorage();
  28. StorageableResult<T> GetStorageableResult();
  29. Task<StorageableResult<T>> ToStorageAsync();
  30. IStorageable<T> As(string tableName);
  31. int ExecuteCommand();
  32. T ExecuteReturnEntity();
  33. Task<T> ExecuteReturnEntityAsync();
  34. Task<int> ExecuteCommandAsync();
  35. Task<int> ExecuteCommandAsync(CancellationToken cancellationToken);
  36. int ExecuteSqlBulkCopy();
  37. Task<int> ExecuteSqlBulkCopyAsync();
  38. IStorageable<T> DefaultAddElseUpdate();
  39. StorageableSplitProvider<T> SplitTable();
  40. StorageablePage<T> PageSize(int PaegSize, Action<int> ActionCallBack = null);
  41. }
  42. public class StorageableInfo<T> where T : class, new()
  43. {
  44. public T Item { get; set; }
  45. internal List<T> Database { get; set; }
  46. internal string[] PkFields { get; set; }
  47. public bool Any(Func<T,bool> expression)
  48. {
  49. return Database.Any(expression);
  50. }
  51. public bool NotAny(Func<T, bool> expression)
  52. {
  53. return !Database.Any(expression);
  54. }
  55. public bool Any()
  56. {
  57. var list = Database.Where(it=>true);
  58. foreach (var pk in PkFields)
  59. {
  60. list = list.Where(it =>IsEquals(it, pk));
  61. }
  62. return list.Any();
  63. }
  64. private bool IsEquals(T it, string pk)
  65. {
  66. var leftValue = it.GetType().GetProperty(pk).GetValue(it, null);
  67. var rightValue = Item.GetType().GetProperty(pk).GetValue(Item, null);
  68. var left = leftValue.ObjToString();
  69. var rigth = rightValue.ObjToString();
  70. if (leftValue!=null&& (leftValue is decimal||leftValue is decimal?))
  71. {
  72. return Convert.ToDecimal(leftValue) == Convert.ToDecimal(rightValue);
  73. }
  74. else
  75. {
  76. return left.EqualCase(rigth);
  77. }
  78. }
  79. public bool NotAny()
  80. {
  81. return !Any();
  82. }
  83. }
  84. public class StorageableMessage<T> : StorageableInfo<T> where T : class, new()
  85. {
  86. public string StorageMessage { get; set; }
  87. public StorageType? StorageType { get; set; }
  88. }
  89. public enum StorageType
  90. {
  91. Insert=0,
  92. Update=1,
  93. Delete=2,
  94. Error=3,
  95. Other=4,
  96. Ignore=5,
  97. }
  98. internal struct KeyValuePair<TKey, TValue,TValue2>
  99. {
  100. public TKey key;
  101. public TValue value1;
  102. public TValue2 value2;
  103. public KeyValuePair(TKey key, TValue value1, TValue2 value2)
  104. {
  105. this.key = key;
  106. this.value1 = value1;
  107. this.value2 = value2;
  108. }
  109. }
  110. public class StorageableResult<T> where T : class, new()
  111. {
  112. public List<StorageableMessage<T>> TotalList { get; set; }
  113. public List<StorageableMessage<T>> InsertList { get; set; }
  114. public List<StorageableMessage<T>> UpdateList { get; set; }
  115. public List<StorageableMessage<T>> DeleteList { get; set; }
  116. public List<StorageableMessage<T>> ErrorList { get; set; }
  117. public List<StorageableMessage<T>> IgnoreList { get; set; }
  118. public List<StorageableMessage<T>> OtherList { get; set; }
  119. public IInsertable<T> AsInsertable { get; set; }
  120. public IUpdateable<T> AsUpdateable { get; set; }
  121. public IDeleteable<T> AsDeleteable { get; set; }
  122. internal List<EntityColumnInfo> _WhereColumnList { get; set; }
  123. internal string _AsName { get; set; }
  124. internal SqlSugarProvider _Context { get; set; }
  125. public int BulkCopy()
  126. {
  127. return this._Context.Fastest<T>().AS(_AsName).BulkCopy(InsertList.Select(it=>it.Item).ToList());
  128. }
  129. public Task<int> BulkCopyAsync()
  130. {
  131. return this._Context.Fastest<T>().AS(_AsName).BulkCopyAsync(InsertList.Select(it => it.Item).ToList());
  132. }
  133. public int BulkUpdate()
  134. {
  135. var isWhereColums = _WhereColumnList != null && _WhereColumnList.Any();
  136. if (isWhereColums)
  137. {
  138. var updateColumns = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => !it.IsPrimarykey && !it.IsIdentity && !it.IsOnlyIgnoreUpdate && !it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray();
  139. return BulkUpdate(updateColumns);
  140. }
  141. else
  142. {
  143. return this._Context.Fastest<T>().AS(_AsName).BulkUpdate(UpdateList.Select(it => it.Item).ToList());
  144. }
  145. }
  146. public Task<int> BulkUpdateAsync()
  147. {
  148. var isWhereColums = _WhereColumnList != null && _WhereColumnList.Any();
  149. if (isWhereColums)
  150. {
  151. var updateColumns = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => !it.IsPrimarykey && !it.IsIdentity && !it.IsOnlyIgnoreUpdate && !it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray();
  152. return BulkUpdateAsync(updateColumns);
  153. }
  154. else
  155. {
  156. return this._Context.Fastest<T>().AS(_AsName).BulkUpdateAsync(UpdateList.Select(it => it.Item).ToList());
  157. }
  158. }
  159. public int BulkUpdate(params string[] UpdateColumns)
  160. {
  161. Check.Exception(UpdateColumns==null, "UpdateColumns is null");
  162. if (_WhereColumnList != null && _WhereColumnList.Any())
  163. {
  164. return this._Context.Fastest<T>().AS(_AsName).BulkUpdate(UpdateList.Select(it => it.Item).ToList(), _WhereColumnList.Select(it => it.DbColumnName).ToArray(), UpdateColumns);
  165. }
  166. else
  167. {
  168. var pkColumns = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).ToArray();
  169. Check.Exception(pkColumns.Count()==0,"need primary key");
  170. return this._Context.Fastest<T>().AS(_AsName).BulkUpdate(UpdateList.Select(it => it.Item).ToList(), pkColumns, UpdateColumns);
  171. }
  172. }
  173. public async Task<int> BulkUpdateAsync(params string[] UpdateColumns)
  174. {
  175. Check.Exception(UpdateColumns == null, "UpdateColumns is null");
  176. if (_WhereColumnList != null && _WhereColumnList.Any())
  177. {
  178. return await this._Context.Fastest<T>().AS(_AsName).BulkUpdateAsync(UpdateList.Select(it => it.Item).ToList(), _WhereColumnList.Select(it => it.DbColumnName).ToArray(), UpdateColumns);
  179. }
  180. else
  181. {
  182. var pkColumns = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).ToArray();
  183. Check.Exception(pkColumns.Count() == 0, "need primary key");
  184. return await this._Context.Fastest<T>().AS(_AsName).BulkUpdateAsync(UpdateList.Select(it => it.Item).ToList(), pkColumns, UpdateColumns);
  185. }
  186. }
  187. }
  188. }