DeleteNavProvider.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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 partial class DeleteNavProvider<Root, T> where T : class, new() where Root : class, new()
  10. {
  11. internal DeleteNavOptions deleteNavOptions;
  12. public List<Root> _Roots { get; set; }
  13. public List<object> _ParentList { get; set; }
  14. public List<object> _RootList { get; set; }
  15. public EntityInfo _ParentEntity { get; set; }
  16. public EntityColumnInfo _ParentPkColumn { get; set; }
  17. public SqlSugarProvider _Context { get; set; }
  18. internal DeleteNavRootOptions _RootOptions { get; set; }
  19. public bool _IsDeletedParant { get; set; }
  20. public List<string> _WhereList = new List<string>();
  21. public List<SugarParameter> _Parameters = new List<SugarParameter>();
  22. public DeleteNavProvider<Root, TChild> ThenInclude< TChild>(Expression<Func<T, TChild>> expression)
  23. where TChild : class, new()
  24. {
  25. this._Context.InitMappingInfo<TChild>();
  26. InitParentList();
  27. Expression newExp = GetMamber(expression);
  28. var name = ExpressionTool.GetMemberName(expression);
  29. var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name);
  30. if (nav.Navigat == null)
  31. {
  32. Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性");
  33. }
  34. if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne)
  35. {
  36. DeleteOneToOne<TChild>(name, nav);
  37. }
  38. else if (nav.Navigat.NavigatType == NavigateType.OneToMany)
  39. {
  40. DeleteOneToMany<TChild>(name, nav);
  41. }
  42. else
  43. {
  44. DeleteManyToMany<TChild>(name, nav);
  45. }
  46. return GetResult<TChild>();
  47. }
  48. public DeleteNavProvider<Root, TChild> ThenInclude<TChild>(Expression<Func<T, List<TChild>>> expression)
  49. where TChild : class, new()
  50. {
  51. this._Context.InitMappingInfo<TChild>();
  52. InitParentList();
  53. Expression newExp = GetMamber(expression);
  54. var name = ExpressionTool.GetMemberName(newExp);
  55. var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name);
  56. if (nav.Navigat == null)
  57. {
  58. Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性");
  59. }
  60. if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne)
  61. {
  62. DeleteOneToOne<TChild>(name, nav);
  63. }
  64. else if (nav.Navigat.NavigatType == NavigateType.OneToMany)
  65. {
  66. DeleteOneToMany<TChild>(name, nav);
  67. }
  68. else
  69. {
  70. DeleteManyToMany<TChild>(name, nav);
  71. }
  72. return GetResult<TChild>();
  73. }
  74. private Expression GetMamber(Expression expression)
  75. {
  76. int i = 0;
  77. Expression newExp =ExpressionTool.GetLambdaExpressionBody(expression);
  78. while (newExp is MethodCallExpression)
  79. {
  80. var callMethod = (newExp as MethodCallExpression);
  81. ActionMethodCallExpression(callMethod);
  82. newExp = callMethod.Arguments[0];
  83. i++;
  84. Check.Exception(i > 10000, expression + " is error");
  85. }
  86. return newExp;
  87. }
  88. private void ActionMethodCallExpression(MethodCallExpression method)
  89. {
  90. var queryBuilder = GetQueryBuilder();
  91. NavigatManager<T> navigatManager = new NavigatManager<T>()
  92. {
  93. Context = this._Context
  94. };
  95. if (method.Method.Name == "ToList")
  96. {
  97. }
  98. else if (method.Method.Name == "Where")
  99. {
  100. navigatManager.CheckHasRootShortName(method.Arguments[0], method.Arguments[1]);
  101. var exp = method.Arguments[1];
  102. _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString());
  103. }
  104. else if (method.Method.Name == "WhereIF")
  105. {
  106. var isOk = LambdaExpression.Lambda(method.Arguments[1]).Compile().DynamicInvoke();
  107. if (isOk.ObjToBool())
  108. {
  109. var exp = method.Arguments[2];
  110. navigatManager.CheckHasRootShortName(method.Arguments[1], method.Arguments[2]);
  111. _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString());
  112. }
  113. }
  114. if (queryBuilder.Parameters != null)
  115. {
  116. _Parameters.AddRange(queryBuilder.Parameters);
  117. }
  118. }
  119. private QueryBuilder GetQueryBuilder()
  120. {
  121. return this._Context.Queryable<T>().QueryBuilder;
  122. }
  123. private DeleteNavProvider<Root, TChild> GetResult<TChild>() where TChild : class, new()
  124. {
  125. return new DeleteNavProvider<Root, TChild>()
  126. {
  127. _Context = this._Context,
  128. _ParentEntity = this._ParentEntity,
  129. _ParentList = this._ParentList,
  130. _Roots = this._Roots,
  131. _ParentPkColumn = this._ParentPkColumn,
  132. _RootList = this._RootList,
  133. _IsDeletedParant=this._IsDeletedParant
  134. };
  135. }
  136. public DeleteNavProvider<Root, Root> AsNav()
  137. {
  138. return new DeleteNavProvider<Root, Root>
  139. {
  140. _Context = _Context,
  141. _ParentEntity = null,
  142. _ParentList = null,
  143. _Roots = _Roots,
  144. _IsDeletedParant = this._IsDeletedParant,
  145. _ParentPkColumn = this._Context.EntityMaintenance.GetEntityInfo<Root>().Columns.First(it => it.IsPrimarykey)
  146. };
  147. }
  148. private void InitParentList()
  149. {
  150. this._ParentEntity = this._Context.EntityMaintenance.GetEntityInfo<T>();
  151. if (_RootList == null)
  152. {
  153. _RootList = _ParentList = _Roots.Cast<object>().ToList();
  154. }
  155. else if (_ParentList == null)
  156. {
  157. _ParentList = _RootList;
  158. var pkColumn = this._Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(it => it.IsPrimarykey);
  159. this._ParentPkColumn = pkColumn;
  160. }
  161. }
  162. }
  163. }