VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之数据库查询 - DataTable转Entity类型数据

本站最新发布   C#从入门到精通
试听地址  
https://www.xin3721.com/eschool/CSharpxin3721/

当使用Sql语句查询数据库,返回DataSet数据集。

DataSet转化为数据列表,可以通过映射方式直接返回Entity数据列表

新建一个特性类,用于数据库列表列名称映射

LinqToDB提供了一个ColumnAttribute,但是通过反射不方便获取ColumnAttribute
获取CustomAttributes时,虽然可以筛选到指定ColumnAttribute,但是CustomAttributeData不容易转换到ColumnAttribute

var customAttributeDatas = mi.CustomAttributes.Where(i=>i.AttributeType.Name==nameof(ColumnAttribute)).ToList();

以下是自定义的特性类

复制代码
 1     [AttributeUsage(AttributeTargets.Property)]
 2     public sealed class ColumnFieldAttribute : Attribute
 3     {
 4         /// <summary>
 5         /// 表对应的字段名

 6         /// </summary>
 7         public string ColumnName { set; get; }
 8 
 9         public ColumnFieldAttribute(string columnName)
10         {
11             ColumnName = columnName;
12         }
13     }
复制代码

通过反射,将DataTable转换为数据列表

复制代码
 1     /// <summary>
 2     /// 将DataRow/DataTable转换成Entity类型
 3     /// </summary>
 4     public static class DataTableConverter<T> where T : new()
 5     {
 6         /// <summary>
 7         /// 将DataTable转换成Entity列表
 8         /// </summary>
 9         /// <param name="dt"></param>
10         /// <returns></returns>
11         public static List<T> ToList(DataTable dt)
12         {
13             List<T> list = new List<T>(dt.Rows.Count);
14             foreach (DataRow dr in dt.Rows)
15             {
16                 list.Add(ToEntity(dr));
17             }
18             return list;
19         }
20         /// <summary>
21         /// 将DataRow行转换成Entity
22         /// </summary>
23         /// <param name="dr"></param>
24         /// <returns></returns>
25         private static T ToEntity(DataRow dr)
26         {
27             T entity = new T();
28             Type info = typeof(T);
29             var members = info.GetMembers();
30             foreach (var memberInfo in members)
31             {
32                 if (memberInfo.MemberType == MemberTypes.Property)
33                 {
34                     //读取属性上的DataField特性
35                     object[] attributes = memberInfo.GetCustomAttributes(typeof(ColumnFieldAttribute), true);
36                     foreach (var attr in attributes)
37                     {
38                         var dataFieldAttr = attr as ColumnFieldAttribute;
39                         if (dataFieldAttr != null)
40                         {
41                             var propInfo = info.GetProperty(memberInfo.Name);
42                             if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
43                             {
44                                 //根据ColumnName,将dataRow中的相对字段赋值给Entity属性
45                                 propInfo.SetValue(entity,
46                                     Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
47                                     null);
48                             }
49                         }
50                     }
51                 }
52             }
53             return entity;
54         }
55     }
复制代码

 

作者:唐宋元明清2188
出处:http://www.cnblogs.com/kybs0/

相关教程