public virtual void Merge(IEnumerable <T> entities, RepositoryMergeOperation operation = RepositoryMergeOperation.Upsert) { if (entities != null && entities.Any()) { var joined = _collection .Join(entities, c => c.Id, e => e.Id, (c, e) => new { c, e }) .ToList(); if (operation == RepositoryMergeOperation.Sync) { var toDelete = _collection.Where(_ => !entities.Any(__ => __.Id.Equals(_.Id))); if (toDelete != null && toDelete.Any()) { _collection.RemoveRange(toDelete); } } var toUpdate = joined .Where(_ => !_.c.Equals(_.e)) // First fast check .Where(_ => Newtonsoft.Json.JsonConvert.SerializeObject(_.c) != Newtonsoft.Json.JsonConvert.SerializeObject(_.e)) // Deeper comparison .Select(_ => _.e); if (toUpdate != null && toUpdate.Any()) { _collection.UpdateRange(toUpdate); } var toAdd = joined != null && joined.Any() ? entities.Except(joined.Select(_ => _.e), new EntityComparer <T, TKey>()) : entities; if (toAdd != null && toAdd.Any()) { _collection.AddRange(toAdd); } _context.SaveChanges(); } }
private void ExecuteMergeCommand(IEnumerable <T> entities, RepositoryMergeOperation operation) { if (entities != null) { var data = Newtonsoft.Json.JsonConvert.SerializeObject(entities); ExecuteMergeCommand(data, operation); } }
public override void Merge(IEnumerable <T> entities, RepositoryMergeOperation operation = RepositoryMergeOperation.Upsert) { if (_sp?.HasMethod(Data.EF.SqlServer.Options.StoredProcedureConfig.MappingConfig.MethodType.Merge) ?? false) { ExecuteMergeCommand(entities, operation); } else { _Merge(entities, operation); } }
private void ExecuteMergeCommand(string data, RepositoryMergeOperation operation) { var p1 = "@data"; var p2 = "@operation"; _db().SetCommandTimeout(_sp.CommandTimeOut?.Sync ?? 180); _db().ExecuteSqlCommand( $"exec [{_sp.Schema}].{_spPrefix}_{_sp.StoredProcedure}_merge {p1},{p2}", new System.Data.SqlClient.SqlParameter(p1, data), new System.Data.SqlClient.SqlParameter(p2, operation.ToString()) ); }
public void Merge(IEnumerable <T> entities, RepositoryMergeOperation operation = RepositoryMergeOperation.Upsert) { switch (operation) { case RepositoryMergeOperation.Upsert: _collection = entities.Union(_collection, new EntityComparer <T, TKey>()).ToList(); break; case RepositoryMergeOperation.Sync: _collection = entities.ToList(); break; } }
public void Merge(IEnumerable <T> entities, RepositoryMergeOperation operation = RepositoryMergeOperation.Upsert) { if (operation == RepositoryMergeOperation.Sync) { _collection.Find(_ => !entities.Any(__ => __.Id.Equals(_.Id))).ForEachAsync(_ => Delete(_)); } _collection.Find(_ => true).ForEachAsync(_ => { var entity = entities.FirstOrDefault(__ => __.Id.Equals(_.Id)); if (entity != null) { Update(entity); } else { Add(entity); } }); }
private void _Merge(IEnumerable <T> entities, RepositoryMergeOperation operation = RepositoryMergeOperation.Upsert) { if (entities != null) { { using (var transaction = _context.Database.BeginTransaction()) { switch (operation) { case RepositoryMergeOperation.Upsert: _context.BulkInsertOrUpdate <T>(entities.ToList(), _options.Merge); break; case RepositoryMergeOperation.Sync: _context.BulkInsertOrUpdateOrDelete <T>(entities.ToList(), _options.Merge); break; } transaction.Commit(); } } } }
public virtual void Merge(RepositoryMergeOperation operation, [FromBody] IEnumerable <T> entities) { _cachedRepository.Merge(entities, operation); }