private static ExtractKeysResult ExtractKeys(ExprMerge merge, IExprAlias sourceAlias) { IExprAlias targetAlias = merge.TargetTable.Alias?.Alias ?? throw new SqExpressException("Target table should have an alias"); var accSource = new List <ExprColumnName>(); var accTarget = new List <ExprColumnName>(); var eqs = merge.On.SyntaxTree().DescendantsAndSelf().OfType <ExprBooleanEq>(); foreach (var exprBooleanEq in eqs) { if (exprBooleanEq.Left is ExprColumn left && exprBooleanEq.Right is ExprColumn right && left.Source is ExprTableAlias ta && right.Source is ExprTableAlias sa) { if (sa.Alias.Equals(sourceAlias) && ta.Alias.Equals(targetAlias)) { accTarget.Add(left.ColumnName); accSource.Add(right.ColumnName); } else if (ta.Alias.Equals(sourceAlias) && sa.Alias.Equals(targetAlias)) { accTarget.Add(right.ColumnName); accSource.Add(left.ColumnName); } } } return(new ExtractKeysResult(accTarget, accSource)); }
public static ExprTableAlias WithAlias(this ExprTableAlias original, IExprAlias newAlias) => new ExprTableAlias(alias: newAlias);
internal MergeDataBuilder(TTable table, IEnumerable <TItem> data, IExprAlias sourceTableAlias) { this._table = table; this._data = data; this._sourceTableAlias = new ExprTableAlias(sourceTableAlias); }
public ExprTableAlias(IExprAlias alias) { this.Alias = alias; }
public static Alias From(IExprAlias exprAlias) => new Alias(false, null, exprAlias);