public static string GetUpdateStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder builder = new StringBuilder("UPDATE " + tableName + " SET "); Dictionary<string, object> values = columnMapper.MapObjectValues(val); KeyValuePair<string, object> primaryKey = columnMapper.MapObjectPrimaryKey(val); foreach (string key in values.Keys.Where(k => k != primaryKey.Key)) { if (AbstractColumnMapper.TypeIsEDClass(values[key].GetType())) { KeyValuePair<string, object> foreignKeyPair = columnMapper.MapObjectPrimaryKey(values[key]); builder.AppendFormat("{0} = '{1}', ", foreignKeyPair.Key, foreignKeyPair.Value); } else { builder.AppendFormat("{0} = '{1}', ", key, values[key]); } } builder.Remove(builder.Length - 2, 2); builder.Append(" WHERE "); KeyValuePair<string, object> pair = columnMapper.MapObjectPrimaryKey(val); builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value)); return builder.ToString(); }
public CompareResult Compare(DataTable left, DataTable right) { if (left == null) { throw new ArgumentNullException(nameof(left)); } if (right == null) { throw new ArgumentNullException(nameof(right)); } _keyMapper = _keyMapperFactory.Create(Config, left, right); _valueMapper = _valueMapperFactory.Create(Config, _keyMapper, left, right); _stopwatch.Restart(); var sorted = Config.IsSorted; var leftSorted = sorted != DataSource.Left && sorted != DataSource.Both ? _sorter.Sort(_keyMapper, left, DataSource.Left) : left; var rightSorted = sorted != DataSource.Right && sorted != DataSource.Both ? _sorter.Sort(_keyMapper, right, DataSource.Right) : right; _stopwatch.Stop(); TimeTakenForSorting = _stopwatch.Elapsed; return(CompareSorted(leftSorted, rightSorted)); }
public static string GetUpdateStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder builder = new StringBuilder("UPDATE " + tableName + " SET "); Dictionary <string, object> values = columnMapper.MapObjectValues(val); KeyValuePair <string, object> primaryKey = columnMapper.MapObjectPrimaryKey(val); foreach (string key in values.Keys.Where(k => k != primaryKey.Key)) { if (AbstractColumnMapper.TypeIsEDClass(values[key].GetType())) { KeyValuePair <string, object> foreignKeyPair = columnMapper.MapObjectPrimaryKey(values[key]); builder.AppendFormat("{0} = '{1}', ", foreignKeyPair.Key, foreignKeyPair.Value); } else { builder.AppendFormat("{0} = '{1}', ", key, values[key]); } } builder.Remove(builder.Length - 2, 2); builder.Append(" WHERE "); KeyValuePair <string, object> pair = columnMapper.MapObjectPrimaryKey(val); builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value)); return(builder.ToString()); }
public SqlEnumerable(IConnectionPolicy connectionPolicy, IColumnMapper columnMapper, string tableName, string whereClause = "") { this.connectionPolicy = connectionPolicy; this.columnMapper = columnMapper; this.tableName = tableName; this.whereClause = whereClause; results = null; }
public static string GetDeleteStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder builder = new StringBuilder("DELETE FROM " + tableName); builder.Append(" WHERE "); KeyValuePair<string, object> pair = columnMapper.MapObjectPrimaryKey(val); builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value)); return builder.ToString(); }
public static string GetDeleteStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder builder = new StringBuilder("DELETE FROM " + tableName); builder.Append(" WHERE "); KeyValuePair <string, object> pair = columnMapper.MapObjectPrimaryKey(val); builder.Append(SqlDataMapper.GetWherePkStringFor(pair.Key, pair.Value)); return(builder.ToString()); }
public SqlEnumerable(IConnectionPolicy connectionPolicy, IColumnMapper columnMapper, Dictionary <Type, IDataMapper> foreignMappers, string tableName, string whereClause = "") { this.connectionPolicy = connectionPolicy; this.columnMapper = columnMapper; this.tableName = tableName; this.whereClause = whereClause; results = null; this.foreignMappers = foreignMappers; }
/// <summary> /// 获取根据ID查询单条记录命令生成树的子节点 /// </summary> /// <returns>根据ID查询单条记录命令生成树的子节点</returns> private IEnumerable <INodeBuilder> GetQueryByIdChildBuilders() { //获取Select节点的子节点集合 和 From节点的子节点集合 foreach (INodeBuilder nodeBuilder in this.NodeBuilders) { yield return(nodeBuilder); } //获取Where节点的子节点集合 IColumnMapper keyColumnMapper = base.TableMapper.KeyMapper; yield return(base.CommandTreeFactory.GetEqualsBuilder(this.TableMapper.Header.TableAlias, keyColumnMapper.ColumnName, keyColumnMapper.Property.Name)); }
public SqlDataMapper(Type objType, string connectionString, Type columnMapperType, Type connectionPolicyType) { this.objType = objType; this.connectionString = connectionString; tableName = objType.GetCustomAttributes(typeof(TableNameAttribute), false).FirstOrDefault().ToString(); connectionPolicy = (AbstractConnectionPolicy)connectionPolicyType.GetConstructor(new Type[] { typeof(String) }) .Invoke(new Object[] { connectionString }); columnMapper = (IColumnMapper)columnMapperType .GetConstructor(new Type[] { typeof(Type), typeof(String), typeof(String) }) .Invoke(new Object[] { objType, connectionString, tableName }); foreignMappers = BuildForeignKeyMappers(); }
/// <summary> /// 转换获取Column节点 /// </summary> /// <param name="columnMapper">Column元数据解析器</param> /// <returns>Column节点</returns> internal static IColumnNode ToColumnNode(this IColumnMapper columnMapper) { return(new ColumnNode() { ColumnName = columnMapper.ColumnName, DataType = columnMapper.DataType, Length = columnMapper.Length, Decimals = columnMapper.Decimals, IsDefault = columnMapper.ColumnAction.ToString().Contains("Default"), IsNull = columnMapper.AllowNull, IsPrimary = columnMapper.ColumnAction.ToString().StartsWith("Primary"), IsIdentity = columnMapper.ColumnAction == ColumnAction.PrimaryAndIdentity }); }
/// <summary> /// 获取根据ID统计单条记录是否存在命令生成树的子节点 /// </summary> /// <returns>根据ID统计单条记录是否存在命令生成树的子节点</returns> private IEnumerable <INodeBuilder> GetQueryCountByIdChildBuilders() { //获取Select节点的子节点集合 yield return(new NodeBuilder(SqlType.Select, "COUNT(*)")); //获取From节点的子Table表达式节点 ITableHeader tableHeader = base.TableMapper.Header; yield return(base.CommandTreeFactory.GetTableBuilder(tableHeader.TableName, tableHeader.TableAlias, tableHeader.SchemaName)); //获取Where节点的子节点集合 IColumnMapper keyColumnMapper = base.TableMapper.KeyMapper; yield return(base.CommandTreeFactory.GetEqualsBuilder(this.TableMapper.Header.TableAlias, keyColumnMapper.ColumnName, keyColumnMapper.Property.Name)); }
public static string GetInsertStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder names = new StringBuilder(); StringBuilder values = new StringBuilder(); Dictionary <string, object> objectValues = columnMapper.MapObjectValues(val); foreach (string key in objectValues.Keys) { names.Append(key + ", "); values.Append("'" + objectValues[key]); } names.Remove(names.Length - 2, 2); values.Remove(values.Length - 2, 2); return(String.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, names, values)); }
/// <summary> /// 获取Where节点的子sql表达式节点 /// </summary> /// <param name="memberExpression">成员表达式</param> /// <param name="rightSqlExpression">右边的sql条件表达式</param> /// <returns>Where节点的子sql表达式节点</returns> protected INodeBuilder GetWhereChildBuilder(MemberExpression memberExpression, string rightSqlExpression) { //若Mapper容器为空 if (_mapperContainer == null) { //则直接获取针对 WITH AS 临时表的sql表达式 return(new NodeBuilder(SqlType.Where, "t.{0} {1}", memberExpression.Member.Name, rightSqlExpression)); } //若不为空,则获取针对实体类对应的表的sql表达式 // 获取当前实体类型的Table元数据解析器 ITableMapper tableMapper = _mapperContainer.GetTableMapper(memberExpression.Expression.Type); // 获取columnMapper IColumnMapper columnMapper = tableMapper.GetColumnMapper(memberExpression.Member.Name); // 获取Where节点的子sql表达式节点 return(_commandTreeFactory.GetWhereChildBuilder(tableMapper.Header.TableAlias, columnMapper.ColumnName, rightSqlExpression)); }
/// <summary> /// 获取基本类型的sql表达式节点 /// </summary> /// <param name="memberExpression">成员表达式</param> /// <returns>基本类型的sql表达式节点</returns> protected ISqlBuilder GetColumnBuilder(MemberExpression memberExpression) { //若Mapper容器为空 if (_mapperContainer == null) { //则直接获取针对 WITH AS 临时表的sql表达式 return(new SqlBuilder("t.{0}", memberExpression.Member.Name)); } //若不为空,则获取针对表的sql表达式 // 获取当前实体类型的Table元数据解析器 ITableMapper tableMapper = _mapperContainer.GetTableMapper(memberExpression.Expression.Type); // 获取columnMapper IColumnMapper columnMapper = tableMapper.GetColumnMapper(memberExpression.Member.Name); // 获取sql列节点生成器 return(_commandTreeFactory.GetColumnBuilder(tableMapper.Header.TableAlias, columnMapper.ColumnName)); }
public static string GetInsertStringFor(IColumnMapper columnMapper, string tableName, object val) { StringBuilder names = new StringBuilder(); StringBuilder values = new StringBuilder(); Dictionary<string, object> objectValues = columnMapper.MapObjectValues(val); foreach (string key in objectValues.Keys) { names.Append(key + ", "); values.Append("'" + objectValues[key]); } names.Remove(names.Length - 2, 2); values.Remove(values.Length - 2, 2); return String.Format("INSERT INTO {0}({1}) VALUES({2})", tableName, names, values); }
/// <summary> /// 加载Update命令生成树的Set节点子节点及其附属的sql参数 /// </summary> /// <param name="setParameters">属性名及属性值字典</param> /// <param name="nodeBuilders">Update命令生成树的Set节点子节点集合</param> /// <param name="sqlParameters">附属的sql参数集合</param> private void LoadUpdateChildNodesAndParameters(IDictionary <string, object> setParameters, List <INodeBuilder> nodeBuilders, List <IDbDataParameter> sqlParameters) { //获取table别名 string tableAlias = this.TableMapper.Header.TableAlias; //遍历setParameters foreach (KeyValuePair <string, object> setPair in setParameters) { //获取columnMapper IColumnMapper columnMapper = this.TableMapper.GetColumnMapper(setPair.Key); //获取参数名 string parameterName = string.Concat("New", columnMapper.Property.Name); //获取Update Set的子sql表达式节点 INodeBuilder setBuilder = this.CommandTreeFactory.GetUpdateSetChildBuilder(tableAlias, columnMapper.ColumnName, parameterName); //添加sql表达式节点 nodeBuilders.Add(setBuilder); //添加sql参数 sqlParameters.Add(this.DbHelper.Parameter(parameterName, setPair.Value)); } }
/// <summary> /// Maps the columns of a reader to a type. /// </summary> /// <param name="type">The type being bound.</param> /// <param name="reader">The reader being bound.</param> /// <param name="startColumn">The index of the first column to bind.</param> /// <param name="columnCount">The number of columns to bind.</param> /// <param name="overrideMapping">An optional column mapper to override the operation</param> /// <returns>The mappings for the columns</returns> internal static List<FieldMapping> MapColumns(Type type, IDataReader reader, int startColumn = 0, int? columnCount = null, IColumnMapper overrideMapping = null) { var array = Enumerable.Range(startColumn, columnCount ?? reader.FieldCount) .Select(i => MapColumn(type, reader, i, overrideMapping)) .ToArray(); // remove duplicates from the list var usedFields = new HashSet<ClassPropInfo>(); for (int i = 0; i < array.Length; i++) { if (array[i] == null) continue; if (usedFields.Contains(array[i].Member)) array[i] = null; else usedFields.Add(array[i].Member); } return array.ToList(); }
public SchemaReader(IForeignKeyMapper foreignKeyMapper, IColumnMapper columnMapper, IIndexMapper indexMapper) { _foreignKeyMapper = foreignKeyMapper; _columnMapper = columnMapper; _indexMapper = indexMapper; }
public SqlServerReadOnlyDictionary(IDbConnection connection, string table, string schema = null, IColumnMapper columnMapper = null) { if (columnMapper == null) { columnMapper = new DefaultColumnMapper(connection, table, schema); } string keyColumn = columnMapper.GetKeyColumnName(); string valueColumn = columnMapper.GetValueColumnName(); Adapter = new SqlServerAdapter(connection, keyColumn, valueColumn, table, schema); IsModified = true; Read(); }
public SqlServerReadOnlyDictionary(string connectionString, string table, string schema = null, IColumnMapper columnMapper = null) : this(new SqlConnection(connectionString), table, schema, columnMapper) { }
public void Init() { _mapper = new ColumnMapper(); }
public ColumnDal(IColumnMapper columnMapper, IDalHelper dalHelper) { _columnMapper = columnMapper; _dalHelper = dalHelper; }
public SqlServerDictionary(IDbConnection connection, string table, string schema = null, IColumnMapper columnMapper = null) : base(connection, table, schema, columnMapper) { }
/// <summary> /// Maps a column of a reader to a type. /// </summary> /// <param name="type">The type being bound.</param> /// <param name="reader">The reader being bound.</param> /// <param name="column">The column to bind.</param> /// <param name="overrideMapping">An optional column mapper to override the operation</param> /// <returns>The mapping for the column</returns> private static FieldMapping MapColumn(Type type, IDataReader reader, int column, IColumnMapper overrideMapping) { string fieldName = null; // if an override mapping was used, then allow it the first go at the mapping if (overrideMapping != null) fieldName = overrideMapping.MapColumn(type, reader, column); // allow for custom mappings if (fieldName == null) fieldName = Tables.Mappers.Select(m => m.MapColumn(type, reader, column)).FirstOrDefault(); // allow the first column to match the * wildcard on Guardian records if (fieldName == null) { var wildcards = ClassPropInfo.GetMembersForType(type).Where(m => m.ColumnName.StartsWith("*", StringComparison.OrdinalIgnoreCase)).OrderBy(m => m.ColumnName).ToList(); if (column < wildcards.Count) fieldName = wildcards[column].Name; } // by default, let all of the transforms transform the name, then search for it if (fieldName == null) { var columnName = Tables.Transform(type, reader.GetName(column)); fieldName = ClassPropInfo.SearchForMatchingField(type, columnName, Tables); } if (fieldName == null) return null; var member = ClassPropInfo.FindMember(type, fieldName); return new FieldMapping(fieldName, member, DbSerializationRule.GetSerializer(reader, column, member)); }
public IRowComparer CreateValueComparer(IColumnMapper colMap, DataTable left, DataTable right) { return(new RowComparer(colMap.LeftColumns, colMap.RightColumns)); }
/// <summary> /// Maps the columns of a reader to a type. /// </summary> /// <param name="type">The type being bound.</param> /// <param name="reader">The reader being bound.</param> /// <param name="startColumn">The index of the first column to bind.</param> /// <param name="columnCount">The number of columns to bind.</param> /// <param name="overrideMapping">An optional column mapper to override the operation</param> /// <returns>The mappings for the columns</returns> internal static List <FieldMapping> MapColumns(Type type, IDataReader reader, int startColumn = 0, int?columnCount = null, IColumnMapper overrideMapping = null) { var array = Enumerable.Range(startColumn, columnCount ?? reader.FieldCount) .Select(i => MapColumn(type, reader, i, overrideMapping)) .ToArray(); // remove duplicates from the list var usedFields = new HashSet <ClassPropInfo>(); for (int i = 0; i < array.Length; i++) { if (array[i] == null) { continue; } if (usedFields.Contains(array[i].Member)) { array[i] = null; } else { usedFields.Add(array[i].Member); } } return(array.ToList()); }
/// <summary> /// Maps a column of a reader to a type. /// </summary> /// <param name="type">The type being bound.</param> /// <param name="reader">The reader being bound.</param> /// <param name="column">The column to bind.</param> /// <param name="overrideMapping">An optional column mapper to override the operation</param> /// <returns>The mapping for the column</returns> private static FieldMapping MapColumn(Type type, IDataReader reader, int column, IColumnMapper overrideMapping) { string fieldName = null; // if an override mapping was used, then allow it the first go at the mapping if (overrideMapping != null) { fieldName = overrideMapping.MapColumn(type, reader, column); } // allow for custom mappings if (fieldName == null) { fieldName = Tables.Mappers.Select(m => m.MapColumn(type, reader, column)).FirstOrDefault(); } // allow the first column to match the * wildcard on Guardian records if (fieldName == null) { var wildcards = ClassPropInfo.GetMembersForType(type).Where(m => m.ColumnName.StartsWith("*", StringComparison.OrdinalIgnoreCase)).OrderBy(m => m.ColumnName).ToList(); if (column < wildcards.Count) { fieldName = wildcards[column].Name; } } // by default, let all of the transforms transform the name, then search for it if (fieldName == null) { var columnName = reader.GetName(column); if (columnName != null) { columnName = Tables.Transform(type, columnName); } fieldName = ClassPropInfo.SearchForMatchingField(type, columnName, Tables); } if (fieldName == null) { return(null); } var member = ClassPropInfo.FindMember(type, fieldName); if (member == null) { return(null); } return(new FieldMapping(fieldName, member, DbSerializationRule.GetSerializer(reader, column, member))); }
private CompareResult CompareSorted(DataTable left, DataTable right) { _stopwatch.Restart(); var result = new CompareResult(); _keyMapper = _keyMapperFactory.Create(Config, left, right); _valueMapper = _valueMapperFactory.Create(Config, _keyMapper, left, right); _valueComparer = _rowComparerFactory.CreateValueComparer(_valueMapper, left, right); _keyComparer = _rowComparerFactory.CreateKeyComparer(_keyMapper, left, right); var leftIx = 0; var rightIx = 0; // Go Through All Left Comparing to Right while (leftIx < left.Rows.Count && rightIx < right.Rows.Count) { var leftRow = left.Rows[leftIx]; var rightRow = right.Rows[rightIx]; var keyResult = _keyComparer.Compare(leftRow, rightRow); if (keyResult == 0) { var valueResult = _valueComparer.Compare(leftRow, rightRow); if (valueResult == 0) { result.Same.Add(new CompareResult.Entry(leftRow, rightRow)); } else { result.Different.Add(new CompareResult.Entry(leftRow, rightRow)); } leftIx++; rightIx++; } else if (keyResult < 0) { result.LeftOnly.Add(leftRow); leftIx++; } else { result.RightOnly.Add(rightRow); rightIx++; } } while (leftIx < left.Rows.Count) { var leftRow = left.Rows[leftIx]; result.LeftOnly.Add(leftRow); leftIx++; } while (rightIx < right.Rows.Count) { var rightRow = right.Rows[rightIx]; result.RightOnly.Add(rightRow); rightIx++; } _stopwatch.Stop(); TimeTakenForComparing = _stopwatch.Elapsed; return(result); }