예제 #1
0
        /// <summary>
        /// Automatically select all <see cref="CandidateKey"/> columns and their data values for specified <see cref="DataRow"/>.
        /// </summary>
        /// <param name="key">The <see cref="CandidateKey"/>.</param>
        /// <param name="dataRow">The specified <see cref="DataRow"/>.</param>
        /// <returns>Number of columns selected.</returns>
        public int AutoSelect(CandidateKey key, DataRow dataRow)
        {
            key.VerifyNotNull(nameof(key));
            dataRow.VerifyNotNull(nameof(dataRow));

            var valueKey = dataRow.Model.PrimaryKey;

            if (valueKey != null && valueKey.GetType() == key.GetType())
            {
                for (int i = 0; i < valueKey.Count; i++)
                {
                    _columnValues[key[i].Column] = valueKey[i].Column.GetValue(dataRow);
                }
                return(valueKey.Count);
            }

            var result       = 0;
            var valueColumns = dataRow.Model.Columns;

            foreach (var columnSort in key)
            {
                var keyColumn   = columnSort.Column;
                var valueColumn = valueColumns.AutoSelect(keyColumn);
                if (valueColumn != null)
                {
                    _columnValues[keyColumn] = valueColumn.GetValue(dataRow);
                    result++;
                }
            }
            return(result);
        }
예제 #2
0
 internal KeyMapping(CandidateKey sourceKey, CandidateKey targetKey)
 {
     sourceKey.VerifyNotNull(nameof(sourceKey));
     targetKey.VerifyNotNull(nameof(targetKey));
     if (targetKey.GetType() != sourceKey.GetType())
         throw new ArgumentException(DiagnosticMessages.KeyMapping_SourceTargetTypeMismatch, nameof(targetKey));
     Debug.Assert(sourceKey.Count == targetKey.Count);
     _sourceKey = sourceKey;
     _targetKey = targetKey;
 }
예제 #3
0
 /// <summary>
 /// Determines whether all columns of specified <see cref="CandidateKey"/> are contained in this dictionary.
 /// </summary>
 /// <param name="key">The specified <see cref="CandidateKey"/>.</param>
 /// <returns><see langword="true" /> if all columns of specified <see cref="CandidateKey"/> are contained in this dictionary,
 /// otherwise <see langword="false" />.</returns>
 public bool ContainsKey(CandidateKey key)
 {
     for (int i = 0; i < key.Count; i++)
     {
         var column = key[i].Column;
         if (!ContainsKey(column))
         {
             return(false);
         }
     }
     return(true);
 }
예제 #4
0
        /// <summary>
        /// Join with target candidate key.
        /// </summary>
        /// <param name="target">The target candidate key.</param>
        /// <returns>Column mappings between this candidate key and the target candidate key.</returns>
        /// <remarks>You must ensure these two canidate key objects have identical columns, otherwise an exception will be thrown.</remarks>
        public IReadOnlyList <ColumnMapping> UnsafeJoin(CandidateKey target)
        {
            target.VerifyNotNull(nameof(target));
            if (Count != target.Count)
            {
                throw new ArgumentException(DiagnosticMessages.PrimaryKey_Join_ColumnsCountMismatch, nameof(target));
            }

            var result = new ColumnMapping[Count];

            for (int i = 0; i < Count; i++)
            {
                var sourceColumn = this[i].Column;
                var targetColumn = target[i].Column;
                if (sourceColumn.DataType != targetColumn.DataType)
                {
                    throw new ArgumentException(DiagnosticMessages.PrimaryKey_Join_ColumnDataTypeMismatch, string.Format("{0}[{1}]", nameof(target), i));
                }
                result[i] = new ColumnMapping(sourceColumn, targetColumn);
            }

            return(result);
        }
예제 #5
0
 public static async Task <int> ExecuteAsync <TSource>(DbTable <T> from, DataSet <TSource> source, CandidateKey targetKey, CancellationToken ct)
     where TSource : Model, new()
 {
     if (source.Count == 0)
     {
         return(0);
     }
     return(await from.DbSession.DeleteAsync(source, from, targetKey, ct));
 }
예제 #6
0
 public static async Task <int> ExecuteAsync <TSource>(DbTable <T> target, DataSet <TSource> source, Action <ColumnMapper, TSource, T> columnMapper, CandidateKey targetKey,
                                                       CancellationToken ct)
     where TSource : class, IEntity, new()
 {
     if (source.Count == 0)
     {
         return(0);
     }
     return(await target.DbSession.UpdateAsync(source, target, columnMapper, targetKey, ct));
 }