public OptimizationDb UpdateOptimizations(IList <DbOptimization> newOptimizations, IList <DbOptimization> oldOptimizations) { var setNew = new HashSet <long>(newOptimizations.Select(opt => opt.Id ?? 0)); var dictOld = new Dictionary <OptimizationKey, DbOptimization>(); foreach (var opt in oldOptimizations) { if (!dictOld.ContainsKey(opt.Key)) { dictOld.Add(opt.Key, opt); } } using (var session = OpenWriteSession()) using (var transaction = session.BeginTransaction()) { // Remove optimizations that are no longer in the list foreach (var optimization in oldOptimizations) { if (!optimization.Id.HasValue) { continue; } if (!setNew.Contains(optimization.Id.Value)) { session.Delete(optimization); } } // Add or update optimizations that have changed from the old list foreach (var optimization in newOptimizations) { DbOptimization optimizationOld; if (dictOld.TryGetValue(optimization.Key, out optimizationOld) && Equals(optimization, optimizationOld)) { continue; } // Create a new instance, because not doing this causes a BindingSource leak var optimizationNewDisconnected = new DbOptimization(optimization); session.SaveOrUpdate(optimizationNewDisconnected); } transaction.Commit(); } return(ChangeProp(ImClone(this), im => im.LoadOptimizations(newOptimizations))); }
public OptimizationDb UpdateOptimizations(IList<DbOptimization> newOptimizations, IList<DbOptimization> oldOptimizations) { var setNew = new HashSet<long>(newOptimizations.Select(opt => opt.Id.HasValue ? opt.Id.Value : 0)); var dictOld = oldOptimizations.ToDictionary(opt => opt.Key); using (var session = OpenWriteSession()) using (var transaction = session.BeginTransaction()) { // Remove optimizations that are no longer in the list foreach (var optimization in oldOptimizations) { if (!optimization.Id.HasValue) continue; if (!setNew.Contains(optimization.Id.Value)) session.Delete(optimization); } // Add or update optimizations that have changed from the old list foreach (var optimization in newOptimizations) { DbOptimization optimizationOld; if (dictOld.TryGetValue(optimization.Key, out optimizationOld) && Equals(optimization, optimizationOld)) continue; // Create a new instance, because not doing this causes a BindingSource leak var optimizationNewDisconnected = new DbOptimization(optimization); session.SaveOrUpdate(optimizationNewDisconnected); } transaction.Commit(); } return ChangeProp(ImClone(this), im => im.LoadOptimizations(newOptimizations)); }
public DbOptimization(DbOptimization other) : this(other.Key, other.Value) { Id = other.Id; }