本文实例讲述了C#实现DataTable映射成Model的方法。分享给大家供大家参考,具体如下:
这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理。
反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系。
步骤1:先创建一个DataFieldAttribute类
using System; namespace Jimmy.ORM { [AttributeUsage(AttributeTargets.Property)] public sealed class DataFieldAttribute:Attribute { /// <summary> /// 表对应的字段名 /// </summary> public string ColumnName { set; get; } public DataFieldAttribute(string columnName) { ColumnName = columnName; } } }
步骤2:在Model/Entity的Class成员上,应用DataField特性,参见下面的代码:
using System; namespace Jimmy.ORM.Entity { [Serializable] public class ProductEntity : DataEntityBase { [DataField("PRODUCT_NO")] public string ProductNo { set; get; } [DataField("PRODUCT_ID")] public int ProductId { set; get; } [DataField("PRODUCT_NAME")] public string ProductName { set; get; } public override string ToString() { return string.Format("ProductNo:{1}{0}ProductId:{2}{0}ProductName:{3}", Environment.NewLine, ProductNo, ProductId, ProductName); } } }
步骤3:该反射出场了,为了方便起见,封装了一个DataConvert类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace Jimmy.ORM { /// <summary> /// 将DataRow/DataTable转换成Entity/Entity列表 /// </summary> public static class DataConvert<T> where T : DataEntityBase, new() { /// <summary> /// 将DataRow行转换成Entity /// </summary> /// <param name="dr"></param> /// <returns></returns> public static T ToEntity(DataRow dr) { T entity = new T(); Type info = typeof(T); var members = info.GetMembers(); foreach (var mi in members) { if (mi.MemberType == MemberTypes.Property) { //读取属性上的DataField特性 object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true); foreach (var attr in attributes) { var dataFieldAttr = attr as DataFieldAttribute; if (dataFieldAttr != null) { var propInfo = info.GetProperty(mi.Name); if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName)) { //根据ColumnName,将dr中的相对字段赋值给Entity属性 propInfo.SetValue(entity, Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType), null); } } } } } return entity; } /// <summary> /// 将DataTable转换成Entity列表 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ToList(DataTable dt) { List<T> list = new List<T>(dt.Rows.Count); foreach (DataRow dr in dt.Rows) { list.Add(ToEntity(dr)); } return list; } } }
步骤4:测试
using System; using System.Data; using Jimmy.ORM.Entity; namespace Jimmy.ORM.Test { class Program { static void Main() { DataTable dt = new DataTable(); dt.Columns.Add("PRODUCT_NO"); dt.Columns.Add("PRODUCT_ID"); dt.Columns.Add("PRODUCT_NAME"); dt.Rows.Add("00001", 1, "手机"); dt.Rows.Add("00002", 2, "服装"); var products = DataConvert<ProductEntity>.ToList(dt); foreach (var entity in products) { Console.WriteLine(entity); } Console.Read(); } } }
完整实例代码代码点击此处本站下载。
希望本文所述对大家C#程序设计有所帮助。
本文向大家介绍C# 实现俄罗斯方块(附源码),包括了C# 实现俄罗斯方块(附源码)的使用技巧和注意事项,需要的朋友参考一下 概述 俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫发明的休闲游戏,帕基特诺夫爱玩拼图,从拼图游戏里得到灵感,设计出了俄罗斯方块。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。本文简述如何通过C#来实现俄罗斯方块,仅供学习分享使用,如有不足之处,还请指正。
本文向大家介绍C#将DataTable转换成list的方法,包括了C#将DataTable转换成list的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#将DataTable转换成list及数据分页的方法。分享给大家供大家参考。具体如下: 将一个DataTable转换成一个List 首先定义一个接收DataTable字段列的类 。类的字段与DataTable的列字段一致 希望本文所
本文向大家介绍C#获取变更过的DataTable记录的实现方法,包括了C#获取变更过的DataTable记录的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#获取变更过的DataTable记录的实现方法,是一个非常实用的功能!具体实现方法如下: 首先DataTable可以看做是一个物理表的内存式存储,每一个DataRow都有一个属性叫做RowState。因此任意一行中某一个字段
本文向大家介绍java实现OpenGL ES纹理映射的方法,包括了java实现OpenGL ES纹理映射的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现OpenGL ES纹理映射的方法。分享给大家供大家参考。具体如下: 1. GlRenderer.java文件: 2. Square.java文件: 3. Triangle.java文件: 4. Run.java文件: 希望
本文向大家介绍C#中将DataTable转化成List 的方法解析,包括了C#中将DataTable转化成List 的方法解析的使用技巧和注意事项,需要的朋友参考一下 前言 通常在DAL层我们都需要把DataTable转换为List<T>让调用者尽可能的好用,尽量的不用关心数据库的字段等,所以我们一般传过去的都是List<T>而不是DataTable。 泛型的好处: 它为使用c#语言编写面向对象程
本文向大家介绍C#中将DataTable转换成CSV文件的方法,包括了C#中将DataTable转换成CSV文件的方法的使用技巧和注意事项,需要的朋友参考一下 DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表。CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记。CSV文件是个纯文本文件,每一行表示一