看了关于DataReader的扩展,发现能节省很多代码。从数据库读取数据最原始方法就是while(true)然后做循环,如果数据库添加一个字段那么你所有读取数据库的方法全部添加。通过扩展这个类就摆脱了这种令人恶心的方式,关于效率我进行测试,当读取不多的时候效率相差不大,当读取几十 ...
看了关于DataReader的扩展,发现能节省很多代码。从数据库读取数据最原始方法就是while(true)然后做循环,如果数据库添加一个字段那么你所有读取数据库的方法全部添加。通过扩展这个类就摆脱了这种令人恶心的方式,关于效率我进行测试,当读取不多的时候效率相差不大,当读取几十万条而至数百万的时候可能效率就不如手写这种普通的方式,大家如果有兴趣可以自己去测试,只有自己测过才算真的。好了,开始写
我先贴一张比较难看的图
但是这就是转换的一个过程:我贴代码
1:
/// <summary> /// 将数据转换为实体集合 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="dr">DbDataReader对象</param> /// <returns>实体集合</returns> /// <remarks></remarks> public static List<T> ToEntitys<T>(this IDataReader dr) where T : new() { if (dr == null) return null; var type = typeof(T);//获取实体类型 var hs = new Hashtable();//目的存所有实体的属性 var propts = type.GetProperties();//获取所有实体属性 foreach (var info in propts)//存入hash表中 { hs[info.Name.ToUpper()] = info; } var entitys = new List<T>(); while (dr.Read()) { var t = new T(); for (var index = 0; index < dr.FieldCount; index++) { var info = (PropertyInfo) hs[dr.GetName(index).ToUpper()];//从流中读取字段,然后看hash表中是否存在此属性 if ((info == null) || !info.CanWrite) continue;//如果没有或者不可写则继续 var data = dr.GetValue(index);//获取属性值 var dType = data.GetType();//获取属性类型 if (dType == typeof (Guid)) info.SetValue(t, data == DBNull.Value ? null : data.ToString(), null);//把Guid转换成get='_blank'>string else info.SetValue(t, data == DBNull.Value ? null : data, null); } entitys.Add(t); } dr.Close();//关闭流 return entitys; }
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:类的扩展之 DataReader的扩展
关键词:DataReader
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。