private IDictionary <string, object> Upsert(string tableName, IDictionary <string, object> data, SimpleExpression criteria, bool resultRequired, IDbConnection connection) { var finder = _transaction == null ? new AdoAdapterFinder(_adapter, connection) : new AdoAdapterFinder(_adapter, _transaction); var existing = finder.FindOne(tableName, criteria); if (existing != null) { // Don't update columns used as criteria var keys = criteria.GetOperandsOfType <ObjectReference>().Select(o => o.GetName().Homogenize()); var updateData = data.Where(kvp => keys.All(k => k != kvp.Key.Homogenize())).ToDictionary(); if (updateData.Count == 0) { return(existing); } var commandBuilder = new UpdateHelper(_adapter.GetSchema()).GetUpdateCommand(tableName, updateData, criteria); if (_transaction == null) { _adapter.Execute(commandBuilder, connection); } else { _adapter.Execute(commandBuilder, _transaction); } return(resultRequired ? finder.FindOne(tableName, criteria) : null); } var inserter = _transaction == null ? new AdoAdapterInserter(_adapter, connection) : new AdoAdapterInserter(_adapter, _transaction); return(inserter.Insert(tableName, data, resultRequired)); }