亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

即使用ADO.NET,也要輕量級實體映射,比Dapper和Ormlite均快

2019-11-17 02:19:26
字體:
來源:轉載
供稿:網友

即使用ADO.NET,也要輕量級實體映射,比Dapper和Ormlite均快

不管出于什么原因,有時候框架人員摒棄了NH或EF,而使用原生數據庫訪問對象。

為了優美的編程,用上我寫的輕量級映射擴展方法吧

目的:將SqlDataReader自動轉換成T類型

代碼如下:

    /// <summary>    /// 提供將SqlDataReader轉成T類型的擴展方法    /// </summary>    public static class SqlDataReaderEx    {        PRivate static object _obj = new object();        /// <summary>        /// 屬性反射信息緩存 key:類型的hashCode,value屬性信息        /// </summary>        private static Dictionary<int, Dictionary<string, PropertyInfo>> propInfoCache = new Dictionary<int, Dictionary<string, PropertyInfo>>();        /// <summary>        /// 將SqlDataReader轉成T類型        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="reader"></param>        /// <returns></returns>        public static T To<T>(this SqlDataReader reader)          where T : new()        {            if (reader == null || reader.HasRows == false) return default(T);            var res = new T();            var propInfos = GetFieldnameFromCache<T>();            for (int i = 0; i < reader.FieldCount; i++)            {                var n = reader.GetName(i).ToLower();                if (propInfos.ContainsKey(n))                {                    PropertyInfo prop = propInfos[n];                    var IsValueType = prop.PropertyType.IsValueType;                    object defaultValue = null;//引用類型或可空值類型的默認值                    if (IsValueType) {                        if ((!prop.PropertyType.IsGenericType)                            ||(prop.PropertyType.IsGenericType&&!prop.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))))                        {                            defaultValue = 0;//非空值類型的默認值                        }                    }                    var v = reader.GetValue(i);                    prop.SetValue(res, (Convert.IsDBNull(v) ? defaultValue : v), null);                }            }            return res;        }        private static Dictionary<string, PropertyInfo> GetFieldnameFromCache<T>()        {            Dictionary<string, PropertyInfo> res = null;            var hashCode = typeof(T).GetHashCode();            var filedNames = GetFieldname<T>();            lock (_obj)            {                if (!propInfoCache.ContainsKey(hashCode))                {                    propInfoCache.Add(hashCode, filedNames);                }            }            res = propInfoCache[hashCode];            return res;        }        /// <summary>        /// 獲取一個類型的對應數據表的字段信息        /// </summary>        /// <typeparam name="T"></typeparam>        /// <returns></returns>        private static Dictionary<string, PropertyInfo> GetFieldname<T>()        {            var res = new Dictionary<string, PropertyInfo>();            var props = typeof(T).GetProperties();            foreach (PropertyInfo item in props)            {                                res.Add(item.GetFieldName(), item);            }            return res;        }             /// <summary>        /// 將SqlDataReader轉成List<T>類型        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="reader"></param>        /// <returns></returns>        public static List<T> ToList<T>(this SqlDataReader reader)            where T : new()        {            if (reader == null || reader.HasRows == false) return null;            var res = new List<T>();            while (reader.Read())            {                res.Add(reader.To<T>());            }            return res;        }                  /// <summary>        /// 獲取該屬性對應到數據表中的字段名稱        /// </summary>        /// <param name="propInfo"></param>        /// <returns></returns>        public static string GetFieldName(this PropertyInfo propInfo)        {            var fieldname = propInfo.Name;            var attr = propInfo.GetCustomAttributes(false);            foreach (var a in attr)            {                if (a is DataFieldAttribute)                {                    fieldname = (a as DataFieldAttribute).Name;                    break;                }            }            return fieldname.ToLower();        }    }

在項目中再也需要reader["fieldname"]這樣的惹人厭的寫法了

換言之,只需要這樣寫:

 Model model=SqlDataReader.To<Model>(); 

基本原理當然少不了反射,實體的屬性可以用DataField特性標記在數據表中的字段名稱,否則與屬性同名,字段名稱不區分大小寫。

DataField特性是自己寫的,只有一個Name屬性。

    public class DataFieldAttribute : Attribute    {        public DataFieldAttribute()        {        }        public DataFieldAttribute(string name)        {            m_name = name;        }        private string m_name = null;        public string Name { get { return m_name; } set { m_name = value; } }    }

是不是很方便,雖然重復造輪子了,但是即使用了原生數據庫訪問對象,又輕松了轉換了實體,帶來的方便性可以彌補一切。

記得點【推薦】

性能測試:

與OrmLite對比:

從圖中看出,在測試1000次的時候,本文的擴展方法比OrmLite的方法快1263ms,測試多次效率均與該結果基本相符。

Test測試源碼如下:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97不卡在线视频| 亚洲第五色综合网| 国产小视频国产精品| 国产女人18毛片水18精品| 国内外成人免费激情在线视频| 亚洲一区二区免费| 成人久久久久久| 精品中文字幕在线观看| 91地址最新发布| 清纯唯美亚洲综合| 97香蕉久久超级碰碰高清版| 91免费在线视频网站| 一区二区三区久久精品| 国产欧美精品在线播放| 日韩av片免费在线观看| 欧美日本在线视频中文字字幕| 中文字幕少妇一区二区三区| 亚洲偷欧美偷国内偷| 日韩av电影在线免费播放| 国产欧美 在线欧美| 中文字幕成人精品久久不卡| yw.139尤物在线精品视频| 成人欧美一区二区三区黑人孕妇| 国产精品一香蕉国产线看观看| 欧美大尺度在线观看| 亚洲欧美中文日韩v在线观看| 日韩一区二区在线视频| 热久久免费国产视频| 久久香蕉精品香蕉| 7777精品视频| 国产精品亚洲视频在线观看| 国产精品久久色| 欧美日韩成人在线播放| 欧美三级免费观看| 国产精品户外野外| 欧美午夜精品伦理| 色婷婷综合成人av| 精品国产一区二区三区久久久| 黄网站色欧美视频| 国产精品美女av| 亚洲视频在线视频| 久久影院免费观看| 美女福利精品视频| 久久久www成人免费精品张筱雨| 久久精品国产99国产精品澳门| 97在线观看免费高清| 国产精品成人久久久久| 欧美视频13p| 欧美超级乱淫片喷水| 日韩精品在线第一页| 伊人久久久久久久久久久久久| 久久夜色精品国产亚洲aⅴ| 国产精品普通话| 欧美一级bbbbb性bbbb喷潮片| 92版电视剧仙鹤神针在线观看| 亚洲国产欧美一区二区三区久久| 日韩hd视频在线观看| 亚洲欧美日韩直播| 国产91成人video| 狠狠爱在线视频一区| 91精品美女在线| 国产成人av网址| 欧美在线视频在线播放完整版免费观看| 亚洲综合在线播放| 日韩中文字幕不卡视频| 亚洲精品国产精品国自产观看浪潮| 国产ts人妖一区二区三区| 亚洲精品第一国产综合精品| 亚洲tv在线观看| 亚洲欧美日韩天堂一区二区| 亚洲欧美日韩精品久久奇米色影视| 日韩欧美aⅴ综合网站发布| 欧美午夜视频在线观看| 日韩av有码在线| 欧美电影免费观看电视剧大全| 久久久久久久久国产| 91av国产在线| 久久精品夜夜夜夜夜久久| 国产精品入口免费视频一| 国产视频精品一区二区三区| 色悠悠久久久久| 全亚洲最色的网站在线观看| 日韩视频永久免费观看| 91精品久久久久久久久久入口| 欧美日韩亚洲一区二区| 亚洲欧美国产视频| 国产区精品在线观看| 国产成人精品久久亚洲高清不卡| 国产综合色香蕉精品| 午夜精品久久久久久久99热浪潮| 亚洲欧洲日产国码av系列天堂| 欧美成年人视频| 国产精品免费电影| 九九精品视频在线观看| 亚洲视频欧美视频| 午夜精品一区二区三区视频免费看| 亚洲天堂网在线观看| 九九热精品视频在线播放| 亚洲国产高潮在线观看| 最好看的2019的中文字幕视频| 最好看的2019的中文字幕视频| 97久久精品在线| 欧美性猛交xxxx| 欧美日韩亚洲精品内裤| 九九久久综合网站| 精品一区二区三区三区| 国产精品久在线观看| 91精品国产色综合久久不卡98口| 欧美大片免费观看在线观看网站推荐| 91视频免费在线| 色综合久久中文字幕综合网小说| 国产成人精品一区二区在线| 6080yy精品一区二区三区| 欧美激情亚洲国产| 国产精品私拍pans大尺度在线| 亚洲精品中文字幕av| 久久久久久久久爱| 国产精品久久久久久久天堂| 久久精品免费播放| 最近中文字幕mv在线一区二区三区四区| 亚洲视频第一页| 91精品综合久久久久久五月天| 国产精品爽爽爽爽爽爽在线观看| 国产精品老女人精品视频| 亚洲人精选亚洲人成在线| 久久夜色精品国产| 亚洲成人精品视频在线观看| 亚洲国产精品久久久久秋霞不卡| 久久综合伊人77777| 亚洲欧美国产精品专区久久| 韩剧1988在线观看免费完整版| 久久久精品亚洲| 精品二区三区线观看| 国产在线视频2019最新视频| 久久夜精品va视频免费观看| 日韩精品在线观看视频| 亚洲男人天堂2023| 成人动漫网站在线观看| 夜夜嗨av色综合久久久综合网| 亚洲a级在线播放观看| 成人午夜激情免费视频| 日韩电视剧在线观看免费网站| 国产精品成人免费视频| 欧美性猛交xxxx黑人猛交| 亚洲国产精品成人av| 欧美丝袜一区二区| 成人激情视频免费在线| 91精品久久久久久| 成人国产亚洲精品a区天堂华泰| 18性欧美xxxⅹ性满足| 这里只有精品视频| 亚洲午夜未满十八勿入免费观看全集| 国产精品自产拍在线观看| 精品久久久一区| 亚洲欧洲偷拍精品| 久久在精品线影院精品国产| 精品丝袜一区二区三区| 国模私拍视频一区| 亚洲欧美日韩精品久久奇米色影视| 亚洲深夜福利网站| 国产精品色午夜在线观看| 国产精品高潮呻吟久久av无限| 中文字幕亚洲专区| 日韩中文字幕精品|