C#:DataTable映射成Model
来源:互联网 发布:linux运维和java开发 编辑:程序博客网 时间:2024/05/21 19:45
这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。
反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。
步骤1:先创建一个DataFieldAttribute类
1 using System; 2 3 namespace Jimmy.ORM 4 { 5 [AttributeUsage(AttributeTargets.Property)] 6 public sealed class DataFieldAttribute:Attribute 7 { 8 /// <summary> 9 /// 表对应的字段名10 /// </summary>11 public string ColumnName { set; get; }12 13 public DataFieldAttribute(string columnName)14 {15 ColumnName = columnName;16 }17 }18 }
步骤2:在Model/Entity的Class成员上,应用DataField特性,参见下面的代码:
1 using System; 2 3 namespace Jimmy.ORM.Entity 4 { 5 [Serializable] 6 public class ProductEntity : DataEntityBase 7 { 8 9 [DataField("PRODUCT_NO")]10 public string ProductNo { set; get; }11 12 [DataField("PRODUCT_ID")]13 public int ProductId { set; get; }14 15 [DataField("PRODUCT_NAME")]16 public string ProductName { set; get; }17 18 public override string ToString()19 {20 return string.Format("ProductNo:{1}{0}ProductId:{2}{0}ProductName:{3}", Environment.NewLine, ProductNo,21 ProductId, ProductName);22 }23 }24 }
步骤3:该反射出场了,为了方便起见,封装了一个DataConvert类
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Reflection; 5 6 namespace Jimmy.ORM 7 { 8 /// <summary> 9 /// 将DataRow/DataTable转换成Entity/Entity列表10 /// </summary>11 public static class DataConvert<T> where T : DataEntityBase, new()12 {13 /// <summary>14 /// 将DataRow行转换成Entity15 /// </summary>16 /// <param name="dr"></param>17 /// <returns></returns>18 public static T ToEntity(DataRow dr)19 {20 T entity = new T();21 Type info = typeof(T);22 var members = info.GetMembers();23 foreach (var mi in members)24 {25 if (mi.MemberType == MemberTypes.Property)26 {27 //读取属性上的DataField特性28 object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true);29 foreach (var attr in attributes)30 {31 var dataFieldAttr = attr as DataFieldAttribute;32 if (dataFieldAttr != null)33 {34 var propInfo = info.GetProperty(mi.Name);35 if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName))36 {37 //根据ColumnName,将dr中的相对字段赋值给Entity属性38 propInfo.SetValue(entity,39 Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),40 null);41 }42 43 }44 }45 }46 }47 return entity;48 }49 50 /// <summary>51 /// 将DataTable转换成Entity列表52 /// </summary>53 /// <param name="dt"></param>54 /// <returns></returns>55 public static List<T> ToList(DataTable dt)56 {57 List<T> list = new List<T>(dt.Rows.Count);58 foreach (DataRow dr in dt.Rows)59 {60 list.Add(ToEntity(dr));61 }62 return list;63 }64 }65 }
步骤4:测试
1 using System; 2 using System.Data; 3 using Jimmy.ORM.Entity; 4 5 namespace Jimmy.ORM.Test 6 { 7 class Program 8 { 9 static void Main()10 {11 DataTable dt = new DataTable();12 dt.Columns.Add("PRODUCT_NO");13 dt.Columns.Add("PRODUCT_ID");14 dt.Columns.Add("PRODUCT_NAME");15 16 dt.Rows.Add("00001", 1, "手机");17 dt.Rows.Add("00002", 2, "服装");18 19 var products = DataConvert<ProductEntity>.ToList(dt);20 21 foreach (var entity in products)22 {23 Console.WriteLine(entity);24 }25 26 Console.Read();27 }28 }29 }
转自:http://www.cnblogs.com/yjmyzz/p/3370541.html
0 0
- C#:DataTable映射成Model
- DataTable转换成List<Model>
- Reflection Datatable To Model
- DataTable转换为Model
- DataTable和DataColumn映射
- C#datatable 存储成xml
- 映射Model方法
- C#DataTable
- 【C#】DataTable
- C#Excel数据转换成DataTable
- DATATABLE 和 model 各自的使用场景
- bootstrap加载model以及dataTable按钮操作
- DataTable与Model格式的转换
- DataTable的点点滴滴(C#)
- C#DataTable使用
- C#DataTable操作
- C#DataTable学习心得
- C#DataTable添加值
- 第1章 概述
- Day7(下).动态库开发基础
- 【华为oj】输入一行字符,分别统计,英文字符,空格字符,数字字符,和其他字符的个数
- HDOJ 1113 Word Amalgamation
- javax.xml.registry.infomodel.User
- C#:DataTable映射成Model
- 《程序员面试宝典》(第三版)笔记整理
- HDFS分布式系统
- 数据结构——直接选择排序(c++)
- Spring MVC基本原理
- Fragment与Activity生命周期
- 泛型的使用总结
- CSDN上的疑问??
- MFC 对话框操作