/// <summary> /// IDataReader转泛型IList(纯反射,无需定义Entity的GetFrom) /// </summary> /// <typeparam name="T">泛型实体T</typeparam> /// <param name="dataReader">DataReader对象</param> /// <returns></returns> public static List <T> ToAnyList <T>(this IDataReader dataReader) where T : class, new() { var ls = new List <T>(); //获取传入的数据类型 var t = typeof(T); if (dataReader != null && !dataReader.IsClosed) { //遍历DataReader对象 while (dataReader.Read()) { //使用与指定参数匹配最高的构造函数,来创建指定类型的实例 var entity = Activator.CreateInstance <T>(); for (var i = 0; i < dataReader.FieldCount; i++) { //判断字段值是否为空或不存在的值 if (!BaseUtil.IsNullOrDbNull(dataReader[i])) { //匹配字段名 var pi = t.GetProperty(dataReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi != null) { //绑定实体对象中同名的字段 pi.SetValue(entity, BaseUtil.ChangeType(dataReader[i], pi.PropertyType), null); } } } ls.Add(entity); } dataReader.Close(); } return(ls); }
/// <summary> /// IDataReader(while (dataReader.Read()){}中使用)循环读取转实体(纯反射,无需定义Entity的GetFrom) /// </summary> /// <typeparam name="T">T</typeparam> /// <param name="dataReader">IDataReader对象</param> /// <returns></returns> public static T ToAnyEntity <T>(this IDataReader dataReader) { if (dataReader != null && !dataReader.IsClosed) { var entity = Activator.CreateInstance <T>(); while (dataReader.Read()) { var t = typeof(T); var count = dataReader.FieldCount; for (var i = 0; i < count; i++) { if (!BaseUtil.IsNullOrDbNull(dataReader[i])) { var pi = t.GetProperty(dataReader.GetName(i), BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (pi != null) { pi.SetValue(entity, BaseUtil.ChangeType(dataReader[i], pi.PropertyType), null); } } } } dataReader.Close(); return(entity); } else { return(default(T)); } }
/// <summary> /// 获取数据表 /// 这个方法按道理目标数据不会非常大,所以可以不优化,问题不大 /// </summary> /// <param name="dbHelper">数据库连接</param> /// <param name="tableName">目标表名</param> /// <param name="name">字段名</param> /// <param name="values">字段值</param> /// <param name="targetField">目标字段</param> /// <returns>数据表</returns> public static string[] GetProperties(this IDbHelper dbHelper, string tableName, string name, Object[] values, string targetField) { var sb = Pool.StringBuilder.Get(); sb.Append("SELECT " + targetField + " FROM " + tableName + " WHERE " + name + " IN (" + string.Join(",", values) + ")"); var dt = dbHelper.Fill(sb.Put()); return(BaseUtil.FieldToArray(dt, targetField).Distinct <string>().Where(t => !string.IsNullOrEmpty(t)).ToArray()); }
/// <summary> /// SwapDyn /// </summary> /// <param name="lstT"></param> /// <param name="id"></param> /// <param name="targetId"></param> /// <returns></returns> public static int SwapDyn(dynamic lstT, string id, string targetId) { var result = 0; string sortCode = BaseUtil.GetPropertyDyn(lstT, id, BaseUtil.FieldSortCode); string targetSortCode = BaseUtil.GetPropertyDyn(lstT, targetId, BaseUtil.FieldSortCode); result = BaseUtil.SetPropertyDyn(lstT, id, BaseUtil.FieldSortCode, targetSortCode); result += BaseUtil.SetPropertyDyn(lstT, targetId, BaseUtil.FieldSortCode, sortCode); return(result); }
/// <summary> /// 两条记录交换排序顺序 /// </summary> /// <param name="dt">数据表</param> /// <param name="id">要移动的记录主键</param> /// <param name="targetId">目标记录主键</param> /// <returns>影响行数</returns> public static int Swap(DataTable dt, string id, string targetId) { var result = 0; var sortCode = BaseUtil.GetProperty(dt, id, BaseUtil.FieldSortCode); var targetSortCode = BaseUtil.GetProperty(dt, targetId, BaseUtil.FieldSortCode); result = BaseUtil.SetProperty(dt, id, BaseUtil.FieldSortCode, targetSortCode); result += BaseUtil.SetProperty(dt, targetId, BaseUtil.FieldSortCode, sortCode); return(result); }
/// <summary> /// 获取父子节点列表 /// </summary> /// <param name="dbHelper">数据库连接</param> /// <param name="tableName">目标表明</param> /// <param name="fieldCode">编码字段</param> /// <param name="code">编码</param> /// <param name="order">排序</param> /// <returns>主键数组</returns> public static string[] GetParentChildrensIdByCode(this IDbHelper dbHelper, string tableName, string fieldCode, string code, string order) { return(BaseUtil.FieldToArray(GetParentChildrensByCode(dbHelper, tableName, fieldCode, code, order, true), BaseUtil.FieldId).Distinct <string>().Where(t => !string.IsNullOrEmpty(t)).ToArray()); }
/// <summary> /// DataTable转泛型(纯反射,无需定义Entity的GetFrom) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt">DataTable</param> /// <returns></returns> public static List <T> ToAnyList <T>(this DataTable dt) where T : class, new() { var t = typeof(T); var properties = t.GetProperties(); var ls = new List <T>(); if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { T entity = new T(); foreach (var pi in properties) { var typeName = pi.Name; if (dt.Columns.Contains(typeName)) { if (!pi.CanWrite) { continue; } var value = dr[typeName]; if (value == DBNull.Value) { continue; } if (pi.PropertyType == typeof(string)) { pi.SetValue(entity, value.ToString(), null); } else if (pi.PropertyType == typeof(int)) { pi.SetValue(entity, BaseUtil.ConvertToInt(value), null); } else if (pi.PropertyType == typeof(int?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableInt(value), null); } else if (pi.PropertyType == typeof(long)) { pi.SetValue(entity, BaseUtil.ConvertToLong(value), null); } else if (pi.PropertyType == typeof(long?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableLong(value), null); } else if (pi.PropertyType == typeof(DateTime)) { pi.SetValue(entity, BaseUtil.ConvertToDateTime(value), null); } else if (pi.PropertyType == typeof(DateTime?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableDateTime(value), null); } else if (pi.PropertyType == typeof(float)) { pi.SetValue(entity, BaseUtil.ConvertToFloat(value), null); } else if (pi.PropertyType == typeof(float?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableFloat(value), null); } else if (pi.PropertyType == typeof(double?)) { pi.SetValue(entity, BaseUtil.ConvertToDouble(value), null); } else if (pi.PropertyType == typeof(double?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableDouble(value), null); } else if (pi.PropertyType == typeof(decimal)) { pi.SetValue(entity, BaseUtil.ConvertToDecimal(value), null); } else if (pi.PropertyType == typeof(decimal?)) { pi.SetValue(entity, BaseUtil.ConvertToNullableDecimal(value), null); } else { pi.SetValue(entity, BaseUtil.ChangeType(value, pi.PropertyType), null); } } } ls.Add(entity); } } return(ls); }