DeleteNavTask.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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.Tasks;
  7. namespace SqlSugar
  8. {
  9. public class DeleteNavTaskInit<Root,T> where T : class, new() where Root : class, new()
  10. {
  11. internal List<T> Roots { get; set; }
  12. internal SqlSugarProvider Context { get; set; }
  13. internal DeleteNavProvider<Root, Root> deleteNavProvider { get; set; }
  14. public DeleteNavMethodInfo IncludesAllFirstLayer(params string[] ignoreColumns)
  15. {
  16. if (ignoreColumns == null)
  17. {
  18. ignoreColumns = new string[] { };
  19. }
  20. this.Context = deleteNavProvider._Context;
  21. var navColumns = this.Context.EntityMaintenance.GetEntityInfo<Root>().Columns.Where(it => !ignoreColumns.Contains(it.PropertyName) || !ignoreColumns.Any(z => z.EqualCase(it.DbColumnName))).Where(it => it.Navigat != null).ToList();
  22. var updateNavs = this;
  23. DeleteNavMethodInfo methodInfo = updateNavs.IncludeByNameString(navColumns[0].PropertyName);
  24. foreach (var item in navColumns.Skip(1))
  25. {
  26. methodInfo = methodInfo.IncludeByNameString(item.PropertyName);
  27. }
  28. return methodInfo;
  29. }
  30. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, TChild>> expression) where TChild : class, new()
  31. {
  32. this.Context = deleteNavProvider._Context;
  33. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  34. Func<DeleteNavProvider<Root, TChild>> func = () => deleteNavProvider.ThenInclude(expression);
  35. result.PreFunc = func;
  36. result.Context = this.Context;
  37. return result;
  38. }
  39. public DeleteNavMethodInfo IncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null)
  40. {
  41. DeleteNavMethodInfo result = new DeleteNavMethodInfo();
  42. result.Context = deleteNavProvider._Context;
  43. var entityInfo = result.Context.EntityMaintenance.GetEntityInfo<T>();
  44. Type properyItemType;
  45. bool isList;
  46. Expression exp = UtilMethods.GetIncludeExpression(navMemberName, entityInfo, out properyItemType, out isList);
  47. var method = this.GetType().GetMyMethod("Include", 2, isList)
  48. .MakeGenericMethod(properyItemType);
  49. var obj = method.Invoke(this, new object[] { exp, updateNavOptions });
  50. result.MethodInfos = obj;
  51. return result;
  52. }
  53. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, List<TChild>>> expression) where TChild : class, new()
  54. {
  55. this.Context = deleteNavProvider._Context;
  56. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  57. Func<DeleteNavProvider<Root, TChild>> func = () => deleteNavProvider.ThenInclude(expression);
  58. result.PreFunc = func;
  59. result.Context = this.Context;
  60. return result;
  61. }
  62. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, List<TChild>>> expression,DeleteNavOptions deleteNavOptions) where TChild : class, new()
  63. {
  64. var result= Include(expression);
  65. deleteNavProvider.deleteNavOptions = deleteNavOptions;
  66. return result;
  67. }
  68. }
  69. public class DeleteNavTask<Root, T> where T : class, new() where Root : class, new()
  70. {
  71. public SqlSugarProvider Context { get; set; }
  72. public Func<DeleteNavProvider<Root, T>> PreFunc { get; set; }
  73. public DeleteNavTask<Root, TChild> ThenInclude<TChild>(Expression<Func<T, TChild>> expression) where TChild : class, new()
  74. {
  75. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  76. Func<DeleteNavProvider<Root, TChild>> func = () => PreFunc().ThenInclude(expression);
  77. result.PreFunc = func;
  78. result.Context = this.Context;
  79. return result;
  80. }
  81. public DeleteNavTask<Root, TChild> ThenInclude<TChild>(Expression<Func<T, TChild>> expression, DeleteNavOptions deleteNavOptions) where TChild : class, new()
  82. {
  83. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  84. Func<DeleteNavProvider<Root, TChild>> func = () => {
  85. var dev = PreFunc();
  86. dev.deleteNavOptions = deleteNavOptions;
  87. return dev.ThenInclude(expression);
  88. };
  89. result.PreFunc = func;
  90. result.Context = this.Context;
  91. return result;
  92. }
  93. public DeleteNavTask<Root, TChild> ThenInclude<TChild>(Expression<Func<T, List<TChild>>> expression) where TChild : class, new()
  94. {
  95. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  96. Func<DeleteNavProvider<Root, TChild>> func = () => PreFunc().ThenInclude(expression);
  97. result.PreFunc = func;
  98. result.Context = this.Context;
  99. return result;
  100. }
  101. public DeleteNavTask<Root, TChild> ThenInclude<TChild>(Expression<Func<T, List<TChild>>> expression,DeleteNavOptions deleteNavOptions) where TChild : class, new()
  102. {
  103. DeleteNavTask<Root, TChild> result = new DeleteNavTask<Root, TChild>();
  104. Func<DeleteNavProvider<Root, TChild>> func = () => {
  105. var dev = PreFunc();
  106. dev.deleteNavOptions = deleteNavOptions;
  107. return dev.ThenInclude(expression);
  108. };
  109. result.PreFunc = func;
  110. result.Context = this.Context;
  111. return result;
  112. }
  113. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, TChild>> expression) where TChild : class, new()
  114. {
  115. return AsNav().ThenInclude(expression);
  116. }
  117. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, TChild>> expression, DeleteNavOptions options) where TChild : class, new()
  118. {
  119. return AsNav().ThenInclude(expression,options);
  120. }
  121. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, List<TChild>>> expression) where TChild : class, new()
  122. {
  123. return AsNav().ThenInclude(expression);
  124. }
  125. public DeleteNavTask<Root, TChild> Include<TChild>(Expression<Func<Root, List<TChild>>> expression,DeleteNavOptions options) where TChild : class, new()
  126. {
  127. return AsNav().ThenInclude(expression, options);
  128. }
  129. public bool ExecuteCommand()
  130. {
  131. PreFunc();
  132. var hasTran = this.Context.Ado.Transaction != null;
  133. if (hasTran)
  134. {
  135. ExecTasks();
  136. }
  137. else
  138. {
  139. this.Context.Ado.UseTran(() =>
  140. {
  141. ExecTasks();
  142. }, ex => throw ex);
  143. }
  144. return true;
  145. }
  146. public async Task<bool> ExecuteCommandAsync()
  147. {
  148. await Task.Run(async () =>
  149. {
  150. ExecuteCommand();
  151. await Task.Delay(0);
  152. });
  153. return true;
  154. }
  155. private DeleteNavTask<Root, Root> AsNav()
  156. {
  157. DeleteNavTask<Root, Root> result = new DeleteNavTask<Root, Root>();
  158. Func<DeleteNavProvider<Root, Root>> func = () => PreFunc().AsNav();
  159. result.PreFunc = func;
  160. result.Context = this.Context;
  161. return result;
  162. }
  163. private void ExecTasks()
  164. {
  165. var tasks=(List<Action>)this.Context.TempItems["_DeleteNavTask"];
  166. tasks.Reverse();
  167. foreach (var task in tasks)
  168. {
  169. task();
  170. }
  171. this.Context.TempItems.Remove("_DeleteNavTask");
  172. }
  173. }
  174. }