实体类和DataTable的转换

引子

最近在项目中在数据库查询的时间,总是要用到数据表到实体类对象列表的转化,自己封装了一个转换的方法,用起来还比较方便,记下来,以后可以重复使用,原理就主要是利用反射,当然有更好的ORM框架可以实现,主要的原因就是我这里没有用orm。

实现

话不多少,直接上实现代码

 /// <summary>
    /// 数据表转换类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DbTableConvertor<T> where T : new()
    {
        /// <summary>
        /// 将DataTable转换为实体列表
        /// 作者: oldman
        /// 创建时间: 2015年9月13日
        /// </summary>
        /// <param name="dt">待转换的DataTable</param>
        /// <returns></returns>
        public List<T> ConvertToList(DataTable dt)
        {
            // 定义集合
            var list = new List<T>();

            if (0 == dt.Rows.Count)
            {
                return list;
            }

            //遍历DataTable中所有的数据行
            foreach (DataRow dr in dt.Rows)
            {
                var entity = new T();

                // 获得此模型的公共属性
                var propertys = entity.GetType().GetProperties();

                //遍历该对象的所有属性
                foreach (var p in propertys)
                {
                    //将属性名称赋值给临时变量
                    string tmpName = p.Name;

                    //检查DataTable是否包含此列(列名==对象的属性名)
                    if (dt.Columns.Contains(tmpName))
                    {
                        // 判断此属性是否有Setter
                        if (!p.CanWrite)
                        {
                            continue; //该属性不可写,直接跳出
                        }

                        //取值
                        var value = dr[tmpName];

                        //如果非空,则赋给对象的属性
                        if (value != DBNull.Value)
                        {
                            p.SetValue(entity, value, null);
                        }
                    }
                }
                //对象添加到泛型集合中
                list.Add(entity);
            }

            return list;
        }

        /// <summary>
        /// 将DataTable的首行转换为实体
        /// 作者: oldman
        /// 创建时间: 2015年9月13日
        /// </summary>
        /// <param name="dt">待转换的DataTable</param>
        /// <returns></returns>
        public T ConvertToEntity(DataTable dt)
        {
            var entity = new T();

            if (0 == dt.Rows.Count)
            {
                return entity;
            }

            // 获得此模型的公共属性
            var propertys = entity.GetType().GetProperties();

            //遍历该对象的所有属性
            foreach (var p in propertys)
            {
                //将属性名称赋值给临时变量
                string tmpName = p.Name;

                //检查DataTable是否包含此列(列名==对象的属性名)
                if (dt.Columns.Contains(tmpName))
                {
                    // 判断此属性是否有Setter
                    if (!p.CanWrite)
                    {
                        continue; //该属性不可写,直接跳出
                    }

                    //取值
                    var value = dt.Rows[0][tmpName];

                    //如果非空,则赋给对象的属性
                    if (value != DBNull.Value)
                    {
                        p.SetValue(entity, value, null);
                    }
                }
            }

            return entity;
        }
    }

注释的都很清楚,欢迎拍砖。

本人的.NET学习技术交流群:226704167

努力学习,只为一个梦想。

时间: 2024-11-06 09:01:43

实体类和DataTable的转换的相关文章

批量插入实体类转化DataTable

/// <summary> /// 根据实体类得到表结构 /// </summary> /// <param name="model">实体类</param> /// <returns></returns> private DataTable CreateData<T>(T model) { DataTable dataTable = new DataTable(typeof(T).Name); for

利用JAXB实现java实体类和xml互相转换

1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同理).map.Teacher.Date 类型的属性 package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccess

实体类转换为DataTable

下面为实体类转换为DataTable的一个小例子: 用到了反射知识. using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Net_ConsoleApplication { class Program { stat

利用XStream实现实体类与xml的转换

package com.wanhua.util; import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver; /** * 利用XStream实现实体类与xml的转换 *  * @author w_xfpenga *  *         2014-11-27 */public class XStream2Text { static XStream xStream = new X

实体类与DataTable互换

/// <summary> /// 实体类转换成DataTable /// </summary> /// <param name="modelList">实体类列表</param> /// <returns></returns> public DataTable FillDataTable(List<T> modelList) { if (modelList == null || modelList.C

XML文件与实体类之间的互相转换

二 序列化 XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML序列化和反序列化,将配置信息保存在一个XML文件(config.xml)中,通过反序列化将配置信息读取出来保存到一个单独的类(Config.cs)中.这样如果需要用到配置信息,没必要每次都读写XML文件,只需要调用Config这个类就可以获取对应节点的信息. config.xml: <?

C#实体类(复杂类)与XML互相转换

实体类转换成XML方法: 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T>(T obj)   {   using (System.IO.StringWriter sw = new StringWriter())   {   Type t = obj.GetType();   System.Xml.Serialization.XmlSerializer serializer

XML和实体类之间相互转换(序列化和反序列化)

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

C# XML和实体类之间相互转换(序列化和反序列化)

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> ///