diff --git a/EgtBEAMWALL.DataLayer/Controllers/ProjController.cs b/EgtBEAMWALL.DataLayer/Controllers/ProjController.cs index 1bb404a6..aa53f68a 100644 --- a/EgtBEAMWALL.DataLayer/Controllers/ProjController.cs +++ b/EgtBEAMWALL.DataLayer/Controllers/ProjController.cs @@ -383,49 +383,65 @@ namespace EgtBEAMWALL.DataLayer.Controllers /// public ProjModel UpdateBtlParts(int ProjId, List BtlPartList) { + // record del proj corrente var currData = FindByProjId(ProjId); - // 2021.05.03 modifica update: esistenti le MODIFICO + // 2021.05.03 modifica update: esistenti le MODIFICO, nuove aggiungo, inesistenti elimino in cascata con Part - // sel delle BTLParts da proj + // sel delle BTLParts del proj List oldBtlParts = dbCtx .BTLPartList .Where(x => x.ProjDbId == currData.ProjDbId) .ToList(); - // converto le BtlParts + // converto le BtlParts da core --> DB List newBtlParts = BtlPartList.Select(x => BTLPartController.ConvertFromCore(x, currData.ProjDbId)).ToList(); try { - // elementi NON + presenti da eliminare - var old2rem = oldBtlParts.Except(newBtlParts).ToList(); - var new2Add = newBtlParts.Except(oldBtlParts).ToList(); - var existing = oldBtlParts.Except(old2rem).ToList(); - var newOnes = new2Add.Except(new2Add).ToList(); + // elementi BtlPartId NON + presenti da eliminare + List bpi2rem = oldBtlParts.Select(x => x.PartId).Except(newBtlParts.Select(y => y.PartId)).ToList(); + List bpi2add = newBtlParts.Select(x => x.PartId).Except(oldBtlParts.Select(y => y.PartId)).ToList(); + List bpiExis = newBtlParts.Select(x => x.PartId).Intersect(oldBtlParts.Select(y => y.PartId)).ToList(); + // aggiorno existing... - foreach (var item in existing) + foreach (var currPartId in bpiExis) { - // recupero nuovo item... - var newItem = newOnes.Where(x => x.PartId == item.PartId).FirstOrDefault(); - if (newItem != null) + // recupero item da aggiornare... + var oldItem = oldBtlParts.Where(x => x.PartId == currPartId).FirstOrDefault(); + // dati nuovo item + var newItem = newBtlParts.Where(x => x.PartId == currPartId).FirstOrDefault(); + if (newItem != null && oldItem != null) { - item.CALC_State = newItem.CALC_State; - item.CNT = newItem.CNT; - item.DO = newItem.DO; - item.H = newItem.H; - item.L = newItem.L; - item.W = newItem.W; - item.Material = newItem.Material; - item.NAM = newItem.NAM; - item.PDN = newItem.PDN; + oldItem.CALC_State = newItem.CALC_State; + oldItem.CNT = newItem.CNT; + oldItem.DO = newItem.DO; + oldItem.H = newItem.H; + oldItem.L = newItem.L; + oldItem.W = newItem.W; + oldItem.Material = newItem.Material; + oldItem.NAM = newItem.NAM; + oldItem.PDN = newItem.PDN; } } + // aggiungo le nuove part + foreach (var newPartId in bpi2add) + { + var newItem = newBtlParts.Where(x => x.PartId == newPartId).FirstOrDefault(); + dbCtx.BTLPartList.Add(newItem); + } + // elimino dal DB i non + esistenti - dbCtx.BTLPartList.RemoveRange(old2rem); - // aggiungo le nuove - dbCtx.BTLPartList.AddRange(new2Add); + foreach (var oldPartId in bpi2rem) + { + // elimino parts nei MachGroup + var oldIstPartList = dbCtx.PartList.Where(x => x.BTLPart.PartId == oldPartId).ToList(); + dbCtx.PartList.RemoveRange(oldIstPartList); + // elimino BtlParts + var oldItem = oldBtlParts.Where(x => x.PartId == oldPartId).FirstOrDefault(); + dbCtx.BTLPartList.Remove(oldItem); + } } catch { } diff --git a/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj b/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj index c8740662..82b1cb34 100644 --- a/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj +++ b/EgtBEAMWALL.DataLayer/EgtBEAMWALL.DataLayer.csproj @@ -53,6 +53,9 @@ ..\packages\MySql.Data.Entity.6.10.9\lib\net452\MySql.Data.Entity.EF6.dll + + ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + @@ -108,6 +111,7 @@ + diff --git a/EgtBEAMWALL.DataLayer/Utils.cs b/EgtBEAMWALL.DataLayer/Utils.cs new file mode 100644 index 00000000..87bb6af8 --- /dev/null +++ b/EgtBEAMWALL.DataLayer/Utils.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgtBEAMWALL.DataLayer +{ + public static partial class LinqExtensions + { + #region Public Methods + + public static IEnumerable ExceptUsingJSonCompare + (this IEnumerable first, IEnumerable second) + { + return first.Except(second, new JSonEqualityComparer()); + } + + #endregion Public Methods + } + + /// + /// Comparer generico basato su Json + /// https://stackoverflow.com/questions/7042090/linq-except-with-custom-iequalitycomparer/7098076#7098076 + /// + /// + public class JSonEqualityComparer : IEqualityComparer + { + #region Public Methods + + public bool Equals(T x, T y) + { + return String.Equals + ( + Newtonsoft.Json.JsonConvert.SerializeObject(x), + Newtonsoft.Json.JsonConvert.SerializeObject(y) + ); + } + + public int GetHashCode(T obj) + { + return Newtonsoft.Json.JsonConvert.SerializeObject(obj).GetHashCode(); + } + + #endregion Public Methods + } +} \ No newline at end of file diff --git a/EgtBEAMWALL.DataLayer/packages.config b/EgtBEAMWALL.DataLayer/packages.config index ffa9838d..1206a06d 100644 --- a/EgtBEAMWALL.DataLayer/packages.config +++ b/EgtBEAMWALL.DataLayer/packages.config @@ -3,4 +3,5 @@ + \ No newline at end of file