C# DataTable DataSet DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展方法分享

 

C# DataTable  DataSet  DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展方法分享

代码越写越灵活,分享越分享越快乐

C# DataTable  DataSet  DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展方法分享

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Reflection;namespace System
{    /// 
    /// DataTable转list泛型集合    
    /// 
    public static class DataTableExtend
    {        /// 
        /// DataTable转换List        /// 
        /// 泛型
        /// DataTable
        /// List泛型集合
        public static ListToList(this DataTable dt) where T : class, new()
        {            var list = new List();            foreach (DataRow dr in dt.Rows)
            {                //泛型对象
                T model = dr.ToDataRowModel();
                list.Add(model);
            }            return list;
        }        /// 
        /// DataSet转换List        /// 
        /// 泛型
        /// DataTable
        /// List泛型集合
        public static ListToList(this DataSet ds) where T : class, new()
        {            var list = new List();
            list = ds.Tables[0].ToList();            return list;
        }        /// 
        /// DataRow转换T模型        /// 
        /// 泛型
        /// DataTable
        /// List泛型集合
        public static T ToDataRowModel(this DataRow dr) where T : class, new()
        {            //泛型对象
            T model = new T();            //属性集合
            var listPro = model.GetType().GetProperties().Where(item => !item.IsDefined(typeof(InternalAttribute), false)).ToArray();            foreach (PropertyInfo pi in listPro)
            {                var columnName = pi.Name;//属性=字段
                var columnType = pi.PropertyType;//属性类型
                var underlyingtype = Nullable.GetUnderlyingType(columnType);//返回指定可以为null值的类型                //判断属性是否可以写入
                if (!pi.CanWrite) continue;                if (!dr.Table.Columns.Contains(columnName)) continue;                var value = dr[columnName];                //判断字段值是否为空
                if (value == DBNull.Value) continue;                //根据属性类型转换数据库字段类型
                if (columnType == typeof(string))
                    pi.SetValue(model, value.ToString(), null);                else if (columnType == typeof(int) || columnType == typeof(int?))
                    pi.SetValue(model, Convert.ToInt32(value), null);                else if (columnType == typeof(DateTime) || columnType == typeof(DateTime?))
                    pi.SetValue(model, Convert.ToDateTime(value), null);                else if (columnType == typeof(decimal))
                    pi.SetValue(model, Convert.ToDecimal(value), null);                else if (columnType == typeof(double))
                    pi.SetValue(model, Convert.ToDouble(value), null);                else if (columnType == typeof(float))
                    pi.SetValue(model, Convert.ToSingle(value), null);                else if ((underlyingtype ?? columnType).IsEnum)
                {                    if (underlyingtype != null && !string.IsNullOrEmpty(value.ToString()))
                        pi.SetValue(model, Enum.Parse(underlyingtype ?? columnType, value.ToString()), null);                    else if (underlyingtype == null && !string.IsNullOrEmpty(value.ToString()))
                        pi.SetValue(model, Convert.ToInt32(value), null);                    else
                        pi.SetValue(model, -1, null);
                }                else
                    pi.SetValue(model, value, null);
            }            return model;
        }
    }
}

 实体列表转换成DataTable

        /// 
        ///     实体列表转换成DataTable        /// 
        /// 实体
        ///  实体列表
        /// 
        public static DataTable EntityListToDataTable(this IList entityList)            where TEntity : class
        {            if (entityList == null) return null;            var dt = new DataTable(typeof(TEntity).Name);            var myPropertyInfo = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);            #region 创建表结构            foreach (var property in myPropertyInfo)
            {                
                Type colType = property.PropertyType;                if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    colType = colType.GetGenericArguments()[0];                    var col = new DataColumn(property.Name, colType) { Caption = property.ToDescription() };
                    col.AllowDBNull = true;
                    dt.Columns.Add(col);
                }                else
                {                    var col = new DataColumn(property.Name, colType) { Caption = property.ToDescription() };
                    dt.Columns.Add(col);
                }
                   
            }            #endregion

            foreach (var entity in entityList)
            {                if (entity == null) continue;                var row = dt.NewRow();                foreach (var propertyInfo in myPropertyInfo)
                {                    if (propertyInfo.GetValue(entity, null) == null)
                        row[propertyInfo.Name] = DBNull.Value;                    else
                        row[propertyInfo.Name] = propertyInfo.GetValue(entity, null);
                }

                dt.Rows.Add(row);
            }            return dt;
        }

实体转换成DataTable

        /// 
        ///     实体转换成DataTable        ///     Add by loki 20201011        /// 
        /// 实体
        /// 
        public static DataTable EntityToDataTable(this TEntity entity)            where TEntity : class
        {            if (entity == null) return null;            var dt = new DataTable(typeof(TEntity).Name);            var myPropertyInfo = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);            #region 创建表结构            foreach (var property in myPropertyInfo)
            {                
                Type colType = property.PropertyType;                if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    colType = colType.GetGenericArguments()[0];                    var col = new DataColumn(property.Name, colType) { Caption = property.ToDescription() };
                    col.AllowDBNull = true;
                    dt.Columns.Add(col);
                }                else
                {                    var col = new DataColumn(property.Name, colType) { Caption = property.ToDescription() };
                    dt.Columns.Add(col);
                }

            }            #endregion
            var row = dt.NewRow();            foreach (var propertyInfo in myPropertyInfo)
            {                if (propertyInfo.GetValue(entity, null) == null)
                    row[propertyInfo.Name] = DBNull.Value;                else
                    row[propertyInfo.Name] = propertyInfo.GetValue(entity, null);
            }

            dt.Rows.Add(row);            return dt;
        }

 

 

你如果觉得有用就拿去不用谢!C# DataTable  DataSet  DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展方法分享,这里其实很简单,就是用到反射技术去实现的,将数据库表字段与C#实体属性进行反射


上一篇:深入了解typeof与instanceof的使用场景及注意事项


下一篇:EFCore3.1+编写自定义的EF.Functions扩展方法