實體類和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;
        }
    }

更改

在幾位院子里大神的指點下,做了一些修改,以后應該多注意這些細節,感謝@雙魚座和@夢在旅途,修改后的如下

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;

namespace SolrNetDemo
{
    /// <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;
            }

            // 獲得此模型的可寫公共屬性  
            IEnumerable<PropertyInfo> propertys = new T().GetType().GetProperties().Where(u => u.CanWrite);
            list = ConvertToEntity(dt, propertys);


            return list;
        }

        /// <summary>
        ///     將DataTable的首行轉換為實體
        ///     作者: oldman
        ///     創建時間: 2015年9月13日
        /// </summary>
        /// <param name="dt">待轉換的DataTable</param>
        /// <returns></returns>
        public T ConvertToEntity(DataTable dt)
        {
            DataTable dtTable = dt.Clone();
            dtTable.Rows.Add(dt.Rows[0].ItemArray);
            return ConvertToList(dtTable)[0];
        }


        private List<T> ConvertToEntity(DataTable dt, IEnumerable<PropertyInfo> propertys)
        {
            var list = new List<T>();
            //遍歷DataTable中所有的數據行  
            foreach (DataRow dr in dt.Rows)
            {
                var entity = new T();

                //遍歷該對象的所有屬性  
                foreach (PropertyInfo p in propertys)
                {
                    //將屬性名稱賦值給臨時變量
                    string tmpName = p.Name;

                    //檢查DataTable是否包含此列(列名==對象的屬性名)    
                    if (!dt.Columns.Contains(tmpName)) continue;
                    //取值  
                    object value = dr[tmpName];
                    //如果非空,則賦給對象的屬性  
                    if (value != DBNull.Value)
                    {
                        p.SetValue(entity, value, null);
                    }
                }
                //對象添加到泛型集合中  
                list.Add(entity);
            }
            return list;
        }
    }
}

 

確實看清了進步的空間,希望大家多交流,共同進步。

 

注釋的都很清楚,歡迎拍磚。

本人的.NET學習技術交流群:226704167

努力學習,只為一個夢想。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM