private DmlfUpdate CompileUpdateCore(Func<TargetColumnSqlModelBase, bool> compareColumn, Func<TargetColumnSqlModelBase, bool> updateColumn, Action<DmlfUpdate> createUpdateSpecialColumns, CompareColumnContext compareContext, UpdateColumnContext updateContext) { var cmd = new DmlfUpdate(); cmd.UpdateTarget = new DmlfSource { Alias = "target" }; cmd.From.Add(SourceJoinModel.SourceToRefsJoin); cmd.From.Add(new DmlfFromItem { Source = new DmlfSource { Alias = "target", TableOrView = TargetTableSqlName, LinkedInfo = TargetLinkedInfo, } }); CreateKeyCondition(cmd, "target"); CreateLifetimeConditions(cmd, "target"); CreateFilterConditions(cmd); createUpdateSpecialColumns(cmd); foreach (var column in TargetColumns) { bool? update = _dbsh.LifetimeHandler.UpdateColumn(column.Name, updateContext); if (update == null) update = updateColumn(column); if (!update.Value) continue; cmd.Columns.Add(new DmlfUpdateField { TargetColumn = column.Name, Expr = column.CreateSourceExpression(SourceJoinModel, false), }); } var orCondition = new DmlfOrCondition(); foreach (var column in TargetColumns) { bool? compare = _dbsh.LifetimeHandler.CompareColumn(column.Name, compareContext); if (compare == null) compare = compareColumn(column); if (!compare.Value) continue; if (column.CannotBeCompared) continue; orCondition.Conditions.Add(new DmlfNotEqualWithNullTestCondition { LeftExpr = column.CreateCompareExpression(column.CreateSourceExpression(SourceJoinModel, false)), RightExpr = column.CreateCompareExpression(column.CreateTargetExpression("target")), CollateSpec = column.UseCollate(SourceJoinModel) ? "DATABASE_DEFAULT" : null, }); } if (orCondition.Conditions.Any()) cmd.AddAndCondition(orCondition); if (!cmd.Columns.Any()) return null; return cmd; }
public virtual bool? UpdateColumn(string name, UpdateColumnContext ctx) => null;
public override bool? UpdateColumn(string name, UpdateColumnContext ctx) { if (ctx == UpdateColumnContext.Update) return ModifyColumns.Any(x => x.Name == name); return false; }