博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# DataTable 和List之间相互转换的方法
阅读量:4683 次
发布时间:2019-06-09

本文共 4955 字,大约阅读时间需要 16 分钟。

一、List<T>/IEnumerable转换到DataTable/DataView

private DataTable ToDataTable
(List
items){ var tb = new DataTable(typeof (T).Name); PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props) { Type t = GetCoreType(prop.PropertyType); tb.Columns.Add(prop.Name, t); } foreach (T item in items) { var values = new object[props.Length]; for (int i = 0; i < props.Length; i++) { values[i] = props[i].GetValue(item, null); } tb.Rows.Add(values); } return tb;} ///
/// Determine of specified type is nullable/// public static bool IsNullable(Type t){ return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));} ///
/// Return underlying type if type is Nullable otherwise return the type/// public static Type GetCoreType(Type t){ if (t != null && IsNullable(t)) { if (!t.IsValueType) { return t; } else { return Nullable.GetUnderlyingType(t); } } else { return t; }}

方法二:

public static DataTable ToDataTable
(IEnumerable
collection) { var props = typeof(T).GetProperties(); var dt = new DataTable(); dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray()); if (collection.Count() > 0) { for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in props) { object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } } return dt; }

二、DataTable转换到List

方法一:

 

public static IList
ConvertTo
(DataTable table) { if (table == null) { return null; } List
rows = new List
(); foreach (DataRow row in table.Rows) { rows.Add(row); } return ConvertTo
(rows); } public static IList
ConvertTo
(IList
rows) { IList
list = null; if (rows != null) { list = new List
(); foreach (DataRow row in rows) { T item = CreateItem
(row); list.Add(item); } } return list;} public static T CreateItem
(DataRow row) { T obj = default(T); if (row != null) { obj = Activator.CreateInstance
(); foreach (DataColumn column in row.Table.Columns) { PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName); try { object value = row[column.ColumnName]; prop.SetValue(obj, value, null); } catch { //You can log something here //throw; } } } return obj; }

把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。   

所以很多人都是按照以下方式做的:  

// 获得查询结果 
DataTable dt = DbHelper.ExecuteDataTable(...); 
// 把DataTable转换为IList<UserInfo> 
IList<UserInfo> users = ConvertToUserInfo(dt);
 

 问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?  

解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了  

using System;      using System.Collections.Generic;  using System.Text;    using System.Data;    using System.Reflection;  namespace NCL.Data    {        ///         /// 实体转换辅助类        ///         public class ModelConvertHelper
where T : new() { public static IList
ConvertToModel(DataTable dt) { // 定义集合 IList
ts = new List
(); // 获得此模型的类型 Type type = typeof(T); string tempName = ""; foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查DataTable是否包含此列 if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(t, value, null); } } ts.Add(t); } return ts; } } }

 

使用方式:  

DataTable dt = DbHelper.ExecuteDataTable(...); 
// 把DataTable转换为IList<UserInfo> 
IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);
 
本文转自:http://www.okbase.net/doc/details/3282

转载于:https://www.cnblogs.com/shangshen/p/6838871.html

你可能感兴趣的文章
Oracle学习之常见错误整理
查看>>
Android实例-处理隐藏输入法后不再显示问题(XE8+小米2)
查看>>
字符串反转(10)
查看>>
HTC Sensation G14开盒
查看>>
Buffer cache spillover: only buffers
查看>>
lock_sga引起的ksvcreate :process(m000) creation failed
查看>>
面向抽象/接口编程以及继承
查看>>
POJ 1704 Georgia and Bob
查看>>
数据库插入数据乱码问题
查看>>
Jquery属性获取——attr()与prop()
查看>>
OVER(PARTITION BY)函数用法
查看>>
uva-11995 - I Can Guess the Data Structure!(栈,优先队列,队列,水题)
查看>>
webpack-dev-server 的服务无法使用的问题
查看>>
day11
查看>>
我组第二次全体会议顺利召开!
查看>>
ideat使用struts2之自定义MVC框架
查看>>
排序_选择排序
查看>>
altium annotate 选项设置 complete existing packages
查看>>
前端的md5加密
查看>>
Effective java 系列之异常转译
查看>>