国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

實體類和DataTable的轉換

2019-11-14 14:00:05
字體:
來源:轉載
供稿:網友

引子

最近在項目中在數據庫查詢的時間,總是要用到數據表到實體類對象列表的轉化,自己封裝了一個轉換的方法,用起來還比較方便,記下來,以后可以重復使用,原理就主要是利用反射,當然有更好的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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正定县| 临江市| 东阿县| 宣威市| 齐河县| 尼玛县| 南郑县| 宁明县| 江陵县| 南开区| 莎车县| 双鸭山市| 黑山县| 旬邑县| 海城市| 同德县| 滨海县| 公安县| 德州市| 弥勒县| 府谷县| 定安县| 全南县| 新安县| 富锦市| 怀安县| 盘锦市| 榕江县| 黄山市| 泊头市| 淮阳县| 平罗县| 伊春市| 芮城县| 英山县| 永平县| 金溪县| 永清县| 来宾市| 临西县| 自治县|