DeleteNavOneToMany.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace SqlSugar
  7. {
  8. public partial class DeleteNavProvider<Root, T> where T : class, new() where Root : class, new()
  9. {
  10. private void DeleteOneToMany<TChild>(string name, EntityColumnInfo nav) where TChild : class, new()
  11. {
  12. var parentEntity = _ParentEntity;
  13. var prentList = _ParentList.Cast<T>().ToList();
  14. var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name);
  15. var thisEntity = this._Context.EntityMaintenance.GetEntityInfo<TChild>();
  16. var thisPkColumn = GetPkColumnByNav(thisEntity, nav);
  17. var thisFkColumn = GetFKColumnByNav(thisEntity, nav);
  18. EntityColumnInfo parentPkColumn = GetParentPkColumn();
  19. EntityColumnInfo parentNavColumn = GetParentPkNavColumn(nav);
  20. if (parentNavColumn != null)
  21. {
  22. parentPkColumn = parentNavColumn;
  23. }
  24. if (!_IsDeletedParant)
  25. SetContext(() => this._Context.Deleteable(prentList)
  26. .EnableDiffLogEventIF(_RootOptions?.IsDiffLogEvent==true,_RootOptions?.DiffLogBizData)
  27. .ExecuteCommand());
  28. var ids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList();
  29. var childList = GetChildList<TChild>().In(thisFkColumn.DbColumnName, ids).ToList();
  30. this._ParentList = childList.Cast<object>().ToList();
  31. this._ParentPkColumn = thisPkColumn;
  32. this._IsDeletedParant = true;
  33. SetContext(() => this._Context.Deleteable(childList).ExecuteCommand());
  34. }
  35. private ISugarQueryable<TChild> GetChildList<TChild>() where TChild : class, new()
  36. {
  37. var queryable = this._Context.Queryable<TChild>();
  38. if (_WhereList.HasValue())
  39. {
  40. foreach (var item in _WhereList)
  41. {
  42. queryable.Where(item);
  43. }
  44. queryable.AddParameters(_Parameters);
  45. }
  46. return queryable;
  47. }
  48. private void SetContext(Action action)
  49. {
  50. var key = "_DeleteNavTask";
  51. if (this._Context.TempItems == null)
  52. {
  53. this._Context.TempItems = new Dictionary<string, object>();
  54. }
  55. if (!this._Context.TempItems.ContainsKey(key))
  56. {
  57. this._Context.TempItems.Add(key, null);
  58. }
  59. var oldTask = this._Context.TempItems[key];
  60. var newTask = new List<Action>();
  61. if (oldTask != null)
  62. {
  63. newTask = (List<Action>)oldTask;
  64. }
  65. newTask.Add(action);
  66. this._Context.TempItems[key] = newTask;
  67. }
  68. private EntityColumnInfo GetParentPkColumn()
  69. {
  70. EntityColumnInfo parentPkColumn = _ParentPkColumn;
  71. if (_ParentPkColumn == null)
  72. {
  73. parentPkColumn = _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey);
  74. }
  75. return parentPkColumn;
  76. }
  77. private EntityColumnInfo GetParentPkNavColumn(EntityColumnInfo nav)
  78. {
  79. EntityColumnInfo result = null;
  80. if (nav.Navigat.Name2.HasValue())
  81. {
  82. result = _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2);
  83. }
  84. return result;
  85. }
  86. private EntityColumnInfo GetPkColumnByNav(EntityInfo entity, EntityColumnInfo nav)
  87. {
  88. var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
  89. if (nav.Navigat.Name2.HasValue())
  90. {
  91. pkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2);
  92. }
  93. return pkColumn;
  94. }
  95. private EntityColumnInfo GetFKColumnByNav(EntityInfo entity, EntityColumnInfo nav)
  96. {
  97. var fkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name);
  98. return fkColumn;
  99. }
  100. }
  101. }