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("", , "手机");
- dt.Rows.Add("", , "服装");
- var products = DataConvert<ProductEntity>.ToList(dt);
- foreach (var entity in products)
- {
- Console.WriteLine(entity);
- }
- Console.Read();
- }
- }
- }
示例代码下载:http://files.cnblogs.com/yjmyzz/DataConvertor.zip
C#:DataTable映射成Model的更多相关文章
- C# DataTable映射成Entity
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...
- DataTable转化为Model
/// <summary> /// 将DataTable转成Model /// </summary> /// <param name="dt"> ...
- datatable转换为list<model> 映射
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...
- DataTable转换成List<T>
很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...
- C# 中DataTable转成模型List
C# 中DataTable转成模型List 引入using System.Reflection; 命名空间 使用注意实体类的属性名必须和DataTable的列名一致 使用: DBList<Sto ...
- DbUtility-关于DataTable转成List的效率问题
DbUtility中的方法ExecuteDataTableAsync()得到的是一个DataTable,而我们常见的情况下,我们需要的不是DataTable,而是List或IList,所以现在需要考虑 ...
- C# DataTable转换成实体列表 与 实体列表转换成DataTable
/// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T"&g ...
- C# 中 DataTable转换成IList
在用C#作开发的时候经常要把DataTable转换成IList:操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便. 注意:实体的 ...
- DataTable转换成IList
//文章出处: http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html DataTable转换成IList 在用C#作开发的时候经常要把 ...
随机推荐
- 1.9 基础知识——GP2.10 高级别的领导检查(Higher level management)
GP2.10 Review the activities,status,and results of XXX process with highter level management and res ...
- NuGet学习笔记2——使用图形化界面打包自己的类库
NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新.在安装好NuGet扩展后,我们已经能够通过NuGet轻松下载自己需要的类库,下面来说一说如何将自己的项 ...
- 【转载】MySQL启多个实例
很多朋友都想在一台服务器上运行多个MySQL Instance,究竟怎么做呢?首先要明晰几个原理, 简称为mysqld读取my.cnf的顺序:第一搜,首先读取/etc/my.cnf,多实例这个配置文件 ...
- 编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt
package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...
- C#正则表达式开源工具,为.net开源绵尽薄力
先交代一下背景,最近工作中经常用到正则表达式,而正则表达式这个东西我个人觉得很鸡肋,不用吧,有些功能实现起来会很麻烦.用吧,又不是说工作中经常用到,只是有时候有些需要求用到而已.但是正则表达式只要一段 ...
- Oracle Data Provider for .NET
官方地址: http://www.oracle.com/technetwork/topics/dotnet/index-085163.html 终于有正式版了.不用装客户端,又小,确实好.
- net-snmp添加自定义MIB
我所知道的添加自定义MIB的方法有三种 1.静态加载,将生成的.c和.h文件加入到相应的位置,重新编译snmp库,优点是不需要修改配置文件,缺点是每次添加都得重新编译: 2.动态加载,将生成的.c ...
- ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler
问题来源:\ThinkPHP3.1.3_full\ThinkPHP\Lib\Core\App.class.php 中 init()方法 if(C('OUTPUT_ENCODE')){ ...
- PHP生成器Generators
下文的第一个逐行读取文件例子用三种方式实现;普通方法,迭代器和生成器,比较了他们的优缺点,很好,可以引用到自己的代码中 ,支持的php版本(PHP 5 >= 5.5.0) 后面的yield讲解, ...
- python log
python的日志模块为logging,它可以将我们想要的信息输出保存到一个日志文件中. # cat log import logging logging.debug('This is debug m ...