DataTable转换成List<T>

很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观。

代码如下:

 1  public static class DataTableToModel
 2     {
 3         public static List<T> ConvertToModel<T>(this DataTable dt)
 4         {
 5             if (dt == null || dt.Rows.Count == 0)
 6             {
 7                 return null;
 8             }
 9
10             var result = new List<T>();
11
12             var objType = typeof(T);
13             var properties = objType.GetProperties();
14             var columnNames = GetDataTableColumnNames(dt);
15
16             foreach (DataRow dr in dt.Rows)
17             {
18                 var obj = objType.Assembly.CreateInstance(objType.FullName);
19                 //var obj = Activator.CreateInstance(objType);
20                 foreach (var property in properties)
21                 {
22                     if (columnNames.Contains(property.Name))
23                     {
24                         var cellValue=dr[property.Name];
25                         object propertyValue=cellValue;
26
27                         //非泛型
28                         if (!property.PropertyType.IsGenericType)
29                         {
30                             propertyValue = cellValue == null ? null : Convert.ChangeType(cellValue, property.PropertyType);
31                         }
32                         else //泛型Nullable<>
33                         {
34                             Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition();
35                             if (genericTypeDefinition == typeof(Nullable<>))
36                             {
37                                 propertyValue = cellValue == null ? null : Convert.ChangeType(cellValue, Nullable.GetUnderlyingType(property.PropertyType));
38                             }
39                         }
40
41                         property.SetValue(obj, propertyValue, null);
42                     }
43                 }
44
45                 result.Add((T)obj);
46             }
47
48             return result;
49         }
50
51         private static HashSet<string> GetDataTableColumnNames(DataTable dt)
52         {
53             var columnNames = new HashSet<string>();
54             foreach (DataColumn column in dt.Columns)
55             {
56                 columnNames.Add(column.ColumnName);
57             }
58             return columnNames;
59         }
60     }
时间: 2024-10-25 13:29:19

DataTable转换成List<T>的相关文章

C#将DataTable转换成list的方法

本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </summary>  /// <param name="userId"></param>  /// <param name="pageIndex">当前页</param>  /// <param name="

将DataTable转换成CSV文件

DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记.CSV文件是个纯文本文件,每一行表示一张图片的许多属性. 在.net项目中运用C#将DataTable转化为CSV文件,现在提供一个较为通用的方法,具体代码如下:         /// <summary>         /// 将DataTable转换成CSV文件         /// &

DataTable转换成IList&lt;T&gt;的简单实现

DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的高频率动作,DataTable却无能为力. 网上很多朋友说用反射实现.那么问题来了,一定要用反射吗? 下面我们用一个不用反射的方式实现: TableToList类 using System; using System.Collections.Generic; using System.Linq; u

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

C# DataTable转换成实体列表 与 实体列表转换成DataTable

/// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T">实体 T </typeparam> /// <param name="table">datatable</param> /// <returns></returns> public static IList<T>

将DataTable转换成list

将DataTable转换成list 及数据分页. <1> /// <summary> /// 酒店评论列表-分页 /// </summary> /// <param name="userId"></param> /// <param name="pageIndex">当前页</param> /// <returns></returns> public stat

C# DataTable转换成DataRow

linq中的cast<T>()及OfType<T>() DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.Rows.Cast<DataRow>().Single(); //OfType<T>():用来将序列中可以转换的转换为指定的序列 如:一个object数组中有整数和字符串,现在想找出其中最大的数 object

如何将DataTable转换成List&lt;T&gt;呢?

昨日在工作中,遇到一个问题:需要将查询出来的DataTable数据源,转换成List<T>的泛型集合(已知T类型).第一反应,我想肯定要用到“泛型”(这不是废话吗?都说了要转换成List<T>泛型集合了),而且还要用到“反射”相关的.呵呵.很快,我就做出了一个小实例,测试通过.下面我将代码贴出来,分享给大家.代码都有详细的注释,读者朋友可以很清晰的看懂我的思路. 这是我写的一个通用转换类,完成此类操作 using System; using System.Collections.G

DataTable转换成IList

//文章出处: http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html DataTable转换成IList 在用C#作开发的时候经常要把DataTable转换成IList:操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便. 注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.ToLower().Contains(实体属性名.ToLower())